事件概述

事件是在代码中可以响应或“处理”的操作。 事件通常由用户作(如单击鼠标或按键)生成,但它们也可以由程序代码或系统生成。

事件驱动的应用程序运行代码以响应事件。 每个窗体和控件都会公开一组预定义的事件,你可以响应这些事件。 如果引发其中一个事件并且存在关联的事件处理程序,则调用处理程序并运行代码。

对象引发的事件类型会有所不同,但大多数控件通常有许多类型。 例如,大多数对象都有一个事件,该事件会在用户单击对象时触发。

注释

许多事件与其他事件一起发生。 例如,在发生 DoubleClick 事件的过程中,会发生 MouseDownMouseUpClick 事件。

有关如何引发和使用事件的常规信息,请参阅 .NET 中的处理和引发事件

代表及其角色

委托是 .NET 中通常用于生成事件处理机制的类。 委托大致等同于函数指针,通常用于 Visual C++ 和其他面向对象的语言。 但与函数指针不同的是,委托是面向对象的、类型安全的和保险的。 此外,如果函数指针仅包含对特定函数的引用,委托包含对对象的引用,以及对对象中的一个或多个方法的引用。

此事件模型使用 委托 将事件绑定到用于处理事件的方法。 委托允许其他类通过指定处理程序方法来注册事件通知。 当发生事件时,委托会调用绑定的方法。 有关如何定义委托的详细信息,请参阅 处理和引发事件

委托可绑定到单个方法或多个方法,后者又称为多路广播。 为事件创建委托时,通常会创建多播事件。 罕见的例外可能是导致特定过程(如显示对话框)的事件,这些过程通常不会为同一事件重复多次。 有关如何创建多播委托的信息,请参阅如何合并委托(多播委托)

多播委托维护一个调用列表,该列表包含绑定到它的方法。 多播委托支持一个 Combine 方法用于向调用列表添加方法,以及一个 Remove 方法用于从中删除方法。

当应用程序记录某个事件时,该控件将通过调用该事件的委托引发事件。 委托依次调用绑定的方法。 在最常见的情况下(多播委托),委托依次调用绑定在调用列表中的每个方法,实现一对多通知。 此策略意味着控件不需要维护事件通知的目标对象列表,委托将处理所有注册和通知。

委托还允许将多个事件绑定到同一个方法上,从而允许多对一通知。 例如,按钮单击事件和菜单命令单击事件都可以调用相同的委托,然后调用单个方法以相同的方式处理这些单独的事件。

用于委托的绑定机制是动态的:委托可以在运行时与任何其签名与事件处理程序的签名匹配的方法绑定。 使用此功能,可以根据条件设置或更改绑定方法,并动态将事件处理程序附加到控件。

Windows 窗体中的事件

Windows 窗体中的事件使用用于处理程序的 EventHandler<TEventArgs> 委托来声明。 每个事件处理程序提供两个参数,使你能够正确处理事件。 以下示例演示 Button 控件 Click 事件的事件处理程序。

Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click

End Sub
private void button1_Click(object sender, System.EventArgs e)
{

}

第一个参数sender提供对引发事件的对象的引用。 第二个参数 e传递一个特定于正在处理的事件的对象。 通过引用对象的属性(有时,其方法),可以获取诸如鼠标事件的位置或拖放事件中传输的数据等信息。

通常,每个事件都会为第二个参数生成具有不同事件对象类型的事件处理程序。 某些事件处理程序(例如 MouseDownMouseUp 事件的事件处理程序)在其第二个参数中具有相同的对象类型。 对于这些类型的事件,可以使用同一事件处理程序来处理这两个事件。

还可以使用相同的事件处理程序来处理不同控件的相同事件。 例如,如果窗体上有一组 RadioButton 控件,则可以为每个 RadioButtonClick 事件创建一个单独的事件处理程序。 有关详细信息,请参阅 如何处理控件事件