c#中委托与事件

来源:互联网 发布:网络洗白是什么意思 编辑:程序博客网 时间:2024/04/30 15:33
 
首先创建一个简单的Windows窗体应用程序,把一个按钮控件从工具箱拖放到窗体上。在属性窗口中把按钮重命名为btnOne。在代码编辑器中把下面的代码添加到Form1构造函数中:
btnOne.Click += new EventHandler(Button_Click);
在Visual Studio中,注意在输入+=运算符之后,就只需按下Tab键两次,编辑器就会完成剩余的输入工作。在大多数情况下这很不错。但在这个例子中,不使用默认的处理程序名,所以应自己输入文本。
这将告诉运行库,在引发btnOne的Click事件时,应执行Button_Click方法。EventHandler是事件用于把处理程序(Button_Click)赋予事件(Click)的委托。注意使用+=运算符把这个新方法添加到委托列表中。这类似于本章前面介绍的多播示例。也就是说,可以为事件添加多个事件处理程序。由于这是一个多播委托,所以要遵循添加多个方法的所有规则,但是不能保证调用方法的顺序。下面在窗体上再添加一个按钮,把它重命名为btnTwo。把btnTwo的Click事件也连接到同一个Button_Click方法上,如下所示:
btnOne.Click += new EventHandler(Button_Click);
btnTwo.Click += new EventHandler(Button_Click);
EventHandler委托已在.NET Framework中定义了。它位于System命名空间,所有在.NET Framework中定义的事件都使用它。如前所述,委托要求添加到委托列表中的所有方法都必须有相同的签名。显然事件委托也有这个要求。下面是Button_Click方法的定义:
Private void Button_Click(object sender, Eventargs e)
{
 
}
这个方法有几个重要的地方。首先,它总是没有返回值。事件处理程序不能有返回值。其次是参数。只要使用EventHandler委托,参数就应是object和EventArgs。第一个参数是引发事件的对象,在这个例子中是btnOne或btnTwo,这取决于被单击的按钮。把一个引用发送给引发事件的对象,就可以把同一个的事件处理程序赋予多个对象。例如,可以为几个按钮定义一个按钮单击处理程序,接着根据sender参数确定单击了哪个按钮。
第二个参数EventArgs是包含有关事件的其他有用信息的对象。这个参数可以是任意类型,只要它派生于EventArgs即可。MouseDown事件使用MouseDownEventArgs,它包含所使用按钮的属性、指针的X和Y坐标,以及与事件相关的其他信息。注意,其命名模式是在类型的后面加上EventArgs。本章的后面将介绍如何创建和使用基于EventArgs的定制对象。
方法的命名也应注意。按照约定,事件处理程序应遵循“object_event.object”的命名约定。object就是引发事件的对象,而event就是被引发的事件。从可读性来看,应遵循这个命名约定。
本例最后在处理程序中添加了一些代码,以完成一些工作。记住有两个按钮使用同一个处理程序。所以首先必须确定是哪个按钮引发了事件,接着调用应执行的操作。在本例中,只是在窗体的一个标签控件上输出一些文本。把一个标签控件从工具箱拖放到窗体上,并将其命名为lblInfo,然后在Button_Click方法中编写如下代码:
if(((Button)sender).Name == "btnOne")
   lblInfo.Text = "Button One was pressed";
else
   lblInfo.Text = "Button Two was pressed";
注意,由于sender参数作为对象发送,所以必须把它的数据类型转换为引发事件的对象类型,在本例中就是Button。本例使用Name属性确定是哪个按钮引发了对象,也可以使用其他属性。例如Tag属性就可以处理这种情形,因为它可以包含任何内容。为了了解事件委托的多播功能,给btnTwoClick事件添加另一个方法,使用默认的方法名。窗体的构造函数如下所示:
btnOne.Click += new EventHandler(Button_Click);
btnTwo.Click += new EventHandler(Button_Click);
btnTwo.Click += new EventHandler(btnTwo_Click);
如果让Visual Studio创建存根(stub),就会在源文件的末尾得到如下方法。但是,必须添加对MessageBox函数的调用:
Private void btnTwo_Click(object sender, EventArgs e)
{
MessageBox.Show("This only happens in Button 2 click event");
}
如果使用匿名方法,就不需要Button_Click方法和btnTwo_Click方法了。事件的代码如下:
btnOne.Click += new EventHandler(lblInfo.Text = "Button One was pressed";);
btnTwo.Click += new EventHandler(lblInfo.Text = "Button Two was pressed";);
btnTwo.Click += new EventHandler(MessageBox.Show
                                  ("This only happens in Button 2 click event"););
在运行这个例子时,单击btnOne会改变标签上的文本。单击btnTwo不仅会改变文本,还会显示消息框。注意,不能保证标签文本在消息框显示之前改变,所以不要在处理程序中编写具有依赖性的代码。 
原创粉丝点击