事件和事件处理程序
更新:2007 年 11 月
虽然可以将 Visual Studio 项目可视化为一系列按序执行的过程,但实际上,大多数程序是事件驱动的 - 意即执行流程是由外部发生的事情(称为“事件”)决定的。
事件是一个信号,它告知应用程序有重要情况发生。例如,用户单击窗体上的某个控件时,窗体可能会引发一个 Click 事件并调用一个处理该事件的过程。事件还允许在不同任务之间进行通信。比方说,您的应用程序脱离主程序执行一个排序任务。若用户取消这一排序,应用程序可以发送一个取消事件让排序过程停止。
事件术语和概念
本节描述 Visual Basic 中与事件一起使用的术语和概念。
声明事件
使用 Event 关键字在类、结构、模块和接口内部声明事件,如下面的示例所示:
Event AnEvent(ByVal EventNumber As Integer)
引发事件
事件就像是通告已发生重要情况的消息。广播该消息的行为称为“引发”事件。在 Visual Basic 中,使用 RaiseEvent 语句引发事件,如下面的示例所示:
RaiseEvent AnEvent(EventNumber)
必须在声明事件的类、模块或结构的范围内引发事件。例如,派生类不能引发从基类继承的事件。
事件发送器
任何能引发事件的对象都是事件发送方,也称“事件源”。窗体、控件和用户定义的对象都是事件发送器。
事件处理程序
“事件处理程序”是相应事件发生时调用的过程。您可以将任何带有匹配签名的有效子例程用作事件处理程序。可是,不能将函数用作事件处理程序,因为它不能将值返回给事件源。
Visual Basic 采用标准命名约定对事件处理程序进行命名,即用下划线将事件发送方和事件的名称组合起来。例如,名为 button1 的按钮的 Click 事件应命名为 Sub button1_Click。
说明: |
---|
建议使用此命名约定定义您自己事件的事件处理程序,但这并不是必选的方法;您可以使用任何有效的子例程名称。 |
关联事件与事件处理程序
在事件处理程序生效之前,首先必须使用 Handles 或 AddHandler 语句将它与事件关联。
WithEvents 语句和 Handles 子句提供了陈述性指定事件处理程序的方法。WithEvents 所声明对象引发的事件可以由任何子例程用命名此事件的 Handles 子句来处理。虽然 Handles 子句是关联事件与事件处理程序的标准方法,它仅限于在编译时关联事件与事件处理程序。
AddHandler 和 RemoveHandler 语句要比 Handles 子句更灵活。它们允许在运行时动态地将事件与一个或更多的事件处理程序连接或者断开,而并不要求使用 WithEvents 来声明对象变量。但是,在使用 WithEvents 时有一些限制。有关更多信息,请参见 WithEvents 语句和 Handles 子句。
在某些情况下,比如使用窗体或控件所关联的事件时,Visual Basic 会自动引出一个空事件处理程序并将它与某个事件关联。例如,在设计模式下双击窗体上的命令按钮时,Visual Basic 会为命令按钮创建一个空事件处理程序和一个 WithEvents 变量,如下面的代码所示:
Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
End Sub