100165343.htm

来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 161 行 · 第 1/2 页

HTM
161
字号
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">目前,我们已经引发了事件,还需要一些代码来处理它。在项目中创建一个新类,在这个例子中把该类称为</span><span lang="EN-US">BusEntity</span><span style="FONT-FAMILY: 宋体">。本项目的目的是检查当前时间的秒数,如果它小于</span><span lang="EN-US">30</span><span style="FONT-FAMILY: 宋体">,就把一个字符串值设置为时间;如果它大于</span><span lang="EN-US">30</span><span style="FONT-FAMILY: 宋体">,就把字符串设置为</span><span lang="EN-US">&quot;&quot;</span><span style="FONT-FAMILY: 宋体">,并取消事件。下面是代码:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">using System;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">using System.IO;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">using System.ComponentModel;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">namespace SimpleEvent</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp; public class BusEntity</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp; {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; string _time =&quot;&quot;;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; public BusEntity()</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Form1.Action += new Form1.ActionEventHandler(Form1_Action);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; private void Form1_Action(object sender, ActionCancelEventArgs ev)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ev.Cancel = !DoAction();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ev.Cancel)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ev.Message =&quot;Wasn&rsquo;t the right time.&quot;;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private bool DoAction()</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool retVal = false;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DateTime tm = DateTime.Now;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(tm.second) &lt; 30)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_time =&quot;The time is&quot; + DateTime.Now.ToLongTimeString();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retVal = true;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _time = &quot;&quot;;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return retVal;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string TimeString</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get {return _time;}</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; }</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">在构造函数中声明了</span><span lang="EN-US">Form1.Action</span><span style="FONT-FAMILY: 宋体">事件的处理程序。注意其语法非常类似于前面的</span><span lang="EN-US">Click</span><span style="FONT-FAMILY: 宋体">事件的语法。由于声明事件使用的模式都是相同的,所以语法也应保持一致。还要注意如何获取</span><span lang="EN-US">Action</span><span style="FONT-FAMILY: 宋体">事件的引用,而无需在</span><span lang="EN-US">BusEntity</span><span style="FONT-FAMILY: 宋体">类中有对</span><span lang="EN-US">Form1</span><span style="FONT-FAMILY: 宋体">的引用。在</span><span lang="EN-US">Form1</span><span style="FONT-FAMILY: 宋体">类中,将</span><span lang="EN-US">Action</span><span style="FONT-FAMILY: 宋体">事件声明为静态,这并不是必需的,但这样可以更容易创建处理程序。我们可以把事件声明为</span><span lang="EN-US">public</span><span style="FONT-FAMILY: 宋体">,但接着需要引用</span><span lang="EN-US">Form1</span><span style="FONT-FAMILY: 宋体">的一个实例。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">在构造函数中编写事件时,调用添加到委托列表中的方法</span><span lang="EN-US">Form1_Action</span><span style="FONT-FAMILY: 宋体">,并遵循命名标准。在处理程序中,需要确定是否取消事件。</span><span lang="EN-US">DoActions</span><span style="FONT-FAMILY: 宋体">方法根据前面描述的时间条件返回一个布尔值,并把</span><span lang="EN-US">_time</span><span style="FONT-FAMILY: 宋体">字符串设置为正确的值。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">DoActions</span><span style="FONT-FAMILY: 宋体">返回值后,就把该值赋给</span><span lang="EN-US">ActionCancelEventArgs</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">Cancel</span><span style="FONT-FAMILY: 宋体">属性。</span><span lang="EN-US">EventArgs</span><span style="FONT-FAMILY: 宋体">类一般仅在事件发送器和接收器之间来回传递值。如果取消了事件</span><span lang="EN-US">(ev.Cancel = true)</span><span style="FONT-FAMILY: 宋体">,</span><span lang="EN-US">Message</span><span style="FONT-FAMILY: 宋体">属性就设置为一个字符串值,以说明事件为什么被取消。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">如果再次查看</span><span lang="EN-US">btnRaise_Click</span><span style="FONT-FAMILY: 宋体">事件处理程序的代码,就可以看出</span><span lang="EN-US">Cancel</span><span style="FONT-FAMILY: 宋体">属性的使用方式:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">private void btnRaise_Click(object sender, EventArgs e)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; ActionCancelEventArgs cancelEvent = new ActionCancelEventArgs();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; OnAction(this, cancelEvent);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; If(cancelEvent.Cancel)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lblInfo.Text = cancelEvent.Message;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; else</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lblInfo.Text = _busEntity.TimeString;</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">注意创建了</span><span lang="EN-US">ActionCancelEventArgs</span><span style="FONT-FAMILY: 宋体">对象。接着引发了事件</span><span lang="EN-US">Action</span><span style="FONT-FAMILY: 宋体">,并传递了新建的</span><span lang="EN-US">ActionCancelEventArgs</span><span style="FONT-FAMILY: 宋体">对象。在调用</span><span lang="EN-US">OnAction</span><span style="FONT-FAMILY: 宋体">方法,引发事件</span><span lang="EN-US">Action</span><span style="FONT-FAMILY: 宋体">时,</span><span lang="EN-US">BusEntity</span><span style="FONT-FAMILY: 宋体">对象中</span><span lang="EN-US">Action</span><span style="FONT-FAMILY: 宋体">事件处理程序的代码就会执行。如果还有其他对象注册了事件</span><span lang="EN-US">Action</span><span style="FONT-FAMILY: 宋体">,它们也会执行。记住,如果其他对象也处理这个事件,它们就会看到同一个</span><span lang="EN-US">ActionCancelEventArgs</span><span style="FONT-FAMILY: 宋体">对象。如果需要确定是哪个对象取消了事件,而且如果有多个对象取消了事件,就需要在</span><span lang="EN-US">ActionCancelEventArgs</span><span style="FONT-FAMILY: 宋体">类中包含某种基于列表的数据结构。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">在与事件委托一起注册的处理程序执行完毕后,就可以查询</span><span lang="EN-US">ActionCancelEventArgs</span><span style="FONT-FAMILY: 宋体">对象,确定它是否被取消了。如果是,</span><span lang="EN-US">lblInfo</span><span style="FONT-FAMILY: 宋体">就包含</span><span lang="EN-US">Message</span><span style="FONT-FAMILY: 宋体">属性值;如果事件没有被取消,</span><span lang="EN-US">lblInfo</span><span style="FONT-FAMILY: 宋体">就会显示当前时间。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">本节这基本上说明了如何利用事件和事件中基于</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">EventArgs</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">的对象,在应用程序中传递信息。</span></p></div>
                <!-- page -->
                <div class="page" style="text-align: center">
                    <a href="100165342.htm">上一页</a>&nbsp;&nbsp;&nbsp;<a href="index.html">首页</a>&nbsp;&nbsp;&nbsp;<a href="100165344.htm">下一页</a>
                </div>
                <div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
                    <div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
                        图书导读
                    </div>
                    <div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
                        <!--导读-->
                        <h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165343.htm'><font color='red'>6.2.2  生成事件</font></a></h1>
                        <div id="divRealteNod2" style="padding-left: 2px">
                        <div style='float:left;width:49%'>·<a href='100165340.htm'>6.1.4  多播委托</a></div><div style='float:right;width:49%'>·<a href='100165341.htm'>6.2  事件</a></div><div style='float:left;width:49%'>·<a href='100165342.htm'>6.2.1  从客户的角度讨论事件</a></div><div style='float:right;width:49%'>·<a href='100165344.htm'>6.3  小结</a></div><div style='float:left;width:49%'>·<a href='100165358.htm'>9.1  对象组</a></div><div style='float:right;width:49%'>·<a href='100165359.htm'>9.1.1  数组列表</a></div></div>
                    </div>
                </div>
                </div>
        </div>
</body>
</html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?