100165342.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 100 行 · 第 1/2 页
HTM
100 行
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">btnOne.Click += new EventHandler(Button_Click);</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">Visual Studio</span><span style="FONT-FAMILY: 宋体">中,注意在输入</span><span lang="EN-US">+=</span><span style="FONT-FAMILY: 宋体">运算符之后,就只需按下</span><span lang="EN-US">Tab</span><span style="FONT-FAMILY: 宋体">键两次,编辑器就会完成剩余的输入工作。在大多数情况下这很不错。但在这个例子中,不使用默认的处理程序名,所以应自己输入文本。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">这将告诉运行库,在引发</span><span lang="EN-US">btnOne</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">Click</span><span style="FONT-FAMILY: 宋体">事件时,应执行</span><span lang="EN-US">Button_Click</span><span style="FONT-FAMILY: 宋体">方法。</span><span lang="EN-US">EventHandler</span><span style="FONT-FAMILY: 宋体">是事件用于把处理程序</span><span lang="EN-US">(Button_Click)</span><span style="FONT-FAMILY: 宋体">赋予事件</span><span lang="EN-US">(Click)</span><span style="FONT-FAMILY: 宋体">的委托。注意使用</span><span lang="EN-US">+=</span><span style="FONT-FAMILY: 宋体">运算符把这个新方法添加到委托列表中。这类似于本章前面介绍的多播示例。也就是说,可以为事件添加多个事件处理程序。由于这是一个多播委托,所以要遵循添加多个方法的所有规则,如前所述,这并不能保证调用方法的顺序。下面在窗体上再添加一个按钮,把它重命名为</span><span lang="EN-US">btnTwo</span><span style="FONT-FAMILY: 宋体">。把</span><span lang="EN-US">btnTwo</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">Click</span><span style="FONT-FAMILY: 宋体">事件也连接到同一个</span><span lang="EN-US">Button_Click</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">btnOne.Click += new EventHandler(Button_Click);</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">btnTwo.Click += new EventHandler(Button_Click);</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span lang="EN-US">EventHandler</span><span style="FONT-FAMILY: 宋体">委托已在</span><span lang="EN-US">Framework</span><span style="FONT-FAMILY: 宋体">中定义了。它位于</span><span lang="EN-US">System</span><span style="FONT-FAMILY: 宋体">命名空间,所有在</span><span lang="EN-US">Framework</span><span style="FONT-FAMILY: 宋体">中定义的事件都使用它。如前所述,委托要求添加到委托列表中的所有方法都必须有相同的签名。显然事件委托也有这个要求。下面是</span><span lang="EN-US">Button_Click</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 Button_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"> </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">EventHandler</span><span style="FONT-FAMILY: 宋体">委托,参数就应是</span><span lang="EN-US">object</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">EventArgs</span><span style="FONT-FAMILY: 宋体">。第一个参数是引发事件的对象,在这个例子中是</span><span lang="EN-US">btnOne</span><span style="FONT-FAMILY: 宋体">或</span><span lang="EN-US">btnTwo</span><span style="FONT-FAMILY: 宋体">,这取决于被单击的按钮。通过把一个引用发送给引发事件的对象,就可以把同一个的事件处理程序赋予多个对象。例如,可以为几个按钮定义一个按钮单击处理程序,接着根据</span><span lang="EN-US">sender</span><span style="FONT-FAMILY: 宋体">参数确定单击了哪个按钮。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">第二个参数</span><span lang="EN-US">EventArgs</span><span style="FONT-FAMILY: 宋体">是包含有关事件的其他有用信息的对象。这个参数可以是任意类型,只要它派生于</span><span lang="EN-US">EventArgs</span><span style="FONT-FAMILY: 宋体">即可。</span><span lang="EN-US">MouseDown</span><span style="FONT-FAMILY: 宋体">事件使用</span><span lang="EN-US">MouseDownEventArgs</span><span style="FONT-FAMILY: 宋体">,它包含所使用按钮的属性、指针的</span><span lang="EN-US">XY</span><span style="FONT-FAMILY: 宋体">坐标,以及与事件相关的其他信息。注意,其命名模式是在类型的后面加上</span><span lang="EN-US">EventArgs</span><span style="FONT-FAMILY: 宋体">。本章的后面将介绍如何创建和使用基于</span><span lang="EN-US">EventArgs</span><span style="FONT-FAMILY: 宋体">的定制对象。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">方法的命名也应注意,按照约定,事件处理程序应遵循“对象</span><span lang="EN-US">-</span><span style="FONT-FAMILY: 宋体">事件”的命名约定。对象就是引发事件的对象,而事件就是被引发的事件。从可读性来看,应遵循这个命名约定。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">本例最后在处理程序中添加了一些代码,以完成一些工作。记住有两个按钮使用同一个处理程序。所以首先必须确定是哪个按钮引发了事件,接着调用应执行的操作。在本例中,只是在窗体的一个标签控件上输出一些文本。把一个标签控件从工具箱拖放到窗体上,并将其命名为</span><span lang="EN-US">lblInfo</span><span style="FONT-FAMILY: 宋体">,然后在</span><span lang="EN-US">Button_Click</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">if(((Button)sender).Name == "btnOne")</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> lblInfo.Text = "Button One was pressed";</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">else</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> lblInfo.Text = "Button Two was pressed";</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">注意,由于</span><span lang="EN-US">sender</span><span style="FONT-FAMILY: 宋体">参数作为对象发送,所以必须把它的数据类型转换为引发事件的对象类型,在本例中就是</span><span lang="EN-US">Button</span><span style="FONT-FAMILY: 宋体">。本例使用</span><span lang="EN-US">Name</span><span style="FONT-FAMILY: 宋体">属性确定是哪个按钮引发了对象,也可以使用其他属性。例如</span><span lang="EN-US">Tag</span><span style="FONT-FAMILY: 宋体">属性就可以处理这种情形,因为它可以包含任何内容。为了了解事件委托的多<span style="LETTER-SPACING: 0.1pt">播功能,给</span></span><span lang="EN-US" style="LETTER-SPACING: 0.1pt">btnTwo</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">的</span><span lang="EN-US" style="LETTER-SPACING: 0.1pt">Click</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">事件添加另一个方法,使用默认的方法名。窗体的构造函数如下所</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">btnOne.Click += new EventHandler(Button_Click);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">btnTwo.Click += new EventHandler(Button_Click);</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">btnTwo.Click += new EventHandler(btnTwo_Click);</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">如果让</span><span lang="EN-US">Visual Studio</span><span style="FONT-FAMILY: 宋体">为您创建存根</span><span lang="EN-US">(stub)</span><span style="FONT-FAMILY: 宋体">,就会在源文件的末尾得到如下方法。但是,必须添加对</span><span lang="EN-US">MessageBox</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 btnTwo_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: 32.25pt"><span lang="EN-US">MessageBox.Show("This only happens in button 2 click event");</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">btnOne</span><span style="FONT-FAMILY: 宋体">会改变标签上的文本。单击</span><span lang="EN-US">btnTwo</span><span style="FONT-FAMILY: 宋体">不仅会改变文本,还会显示消息框。注意,不能保证标签文本在消息框显示之前改变,所以不要在处理程序中编写具有顺序依赖性的代码。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">我们已经学习了许多概念,但要在接收器中编写的代码量是很小的。记住,编写事件接收器常常比编写事件发送器要频繁得多。至少在</span><span lang="EN-US">Windows</span><span style="FONT-FAMILY: 宋体">用户界面上,</span><span lang="EN-US">Microsoft</span><span style="FONT-FAMILY: 宋体">已经编写了所有需要的事件发送器</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">它们都在</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">基类中,在</span><span lang="EN-US">Windows.Forms</span><span style="FONT-FAMILY: 宋体">命名空间中</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165341.htm">上一页</a> <a href="index.html">首页</a> <a href="100165343.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='100165342.htm'><font color='red'>6.2.1 从客户的角度讨论事件</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165339.htm'>6.1.3 BubbleSorter示例</a></div><div style='float:right;width:49%'>·<a href='100165340.htm'>6.1.4 多播委托</a></div><div style='float:left;width:49%'>·<a href='100165341.htm'>6.2 事件</a></div><div style='float:right;width:49%'>·<a href='100165343.htm'>6.2.2 生成事件</a></div><div style='float:left;width:49%'>·<a href='100165344.htm'>6.3 小结</a></div><div style='float:right;width:49%'>·<a href='100165358.htm'>9.1 对象组</a></div></div>
</div>
</div>
</div>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?