事件 (Visual Basic)
虽然您可以用一系列按序执行的过程将 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 子句提供了陈述性指定事件处理程序的方法。 用 WithEvents 关键字所声明对象引发的事件可以由任何过程用该事件的 Handles 语句来处理,如下面的示例所示:
' Declare a WithEvents variable.
Dim WithEvents EClass As New EventClass
' Call the method that raises the object's events.
Sub TestEvents()
EClass.RaiseEvents()
End Sub
' Declare an event handler that handles multiple events.
Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent
MsgBox("Received Event.")
End Sub
Class EventClass
Public Event XEvent()
Public Event YEvent()
' RaiseEvents raises both events.
Sub RaiseEvents()
RaiseEvent XEvent()
RaiseEvent YEvent()
End Sub
End Class
WithEvents 语句和 Handles 子句常常是事件处理程序的最佳选择,因为它们所用的声明语法使得对事件处理的编码和调试更加容易,并使人可以更加轻松地阅读它。 可是,要注意使用 WithEvents 变量时有以下限制:
不能把 WithEvents 变量用作对象变量。 即,不能将它声明为 Object,在声明变量时必须指定类名称。
由于共享事件 未绑定到类实例,所以不能使用 WithEvents 以声明方式处理共享事件。 同样,不能使用 WithEvents 或 Handles 处理来自 Structure 的事件。 在这两种情况下,您可以使用 AddHandler 语句处理这些事件。
不能创建 WithEvents 变量数组。
WithEvents 变量允许单个事件处理程序来处理一类或多类事件,或一个或多个事件处理程序来处理同类事件。
虽然 Handles 子句是关联事件与事件处理程序的标准方法,它仅限于在编译时关联事件与事件处理程序。
在某些情况下,比如,在对待与窗体或控件关联的事件时,Visual Basic 会自动引出一个空事件处理程序并将它与某个事件关联。 例如,在设计模式下双击窗体上的命令按钮时,Visual Basic 会为命令按钮创建一个空事件处理程序和一个 WithEvents 变量,如下面的代码所示:
Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub
AddHandler 和 RemoveHandler
AddHandler 语句与 Handles 子句相似,因为两者都允许指定事件处理程序。 可是,AddHandler 与 RemoveHandler 一起使用时提供了比 Handles 子句更大的灵活性,它们允许动态地添加、移除和更改与某事件关联的事件处理程序。 如果想处理共享事件或结构中的事件,则必须使用 AddHandler。
AddHandler 使用两个参数:来自事件发送器(如控件)的事件的名称和计算委托的表达式。 使用 AddHandler 时不需要显式指定委托类,因为 AddressOf 语句总是返回委托的引用。 下面的示例中,事件处理程序与对象引发的事件相互关联:
AddHandler Obj.XEvent, AddressOf Me.XEventHandler
RemoveHandler 将事件从事件处理程序断开,它所用语法与 AddHandler 相同。 例如:
RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler
在下面的示例中,一个事件处理程序与一个事件关联,并引发了该事件。 事件处理程序捕获该事件并显示消息。
然后,第一个事件处理程序被移除,改由另一个事件处理程序与该事件关联。 当该事件再次被引发时,系统会显示不同的消息。
最后,第二个事件处理程序被移除,且第三次引发了该事件。 由于不再有事件处理程序与该事件关联,因此不会执行任何操作。
Module Module1
Sub Main()
Dim c1 As New Class1
' Associate an event handler with an event.
AddHandler c1.AnEvent, AddressOf EventHandler1
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler1
' Now associate a different event handler with the event.
AddHandler c1.AnEvent, AddressOf EventHandler2
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler2
' This event will not be handled.
c1.CauseTheEvent()
End Sub
Sub EventHandler1()
' Handle the event.
MsgBox("EventHandler1 caught event.")
End Sub
Sub EventHandler2()
' Handle the event.
MsgBox("EventHandler2 caught event.")
End Sub
Public Class Class1
' Declare an event.
Public Event AnEvent()
Sub CauseTheEvent()
' Raise an event.
RaiseEvent AnEvent()
End Sub
End Class
End Module
处理自基类继承的事件
派生类(继承某个基类特征的类)能用 Handles MyBase 语句处理它们的基类所引发的事件。
处理来自基类的事件
通过给事件处理程序过程的声明行添加“Handles MyBase.事件名”语句来声明派生类中的事件处理程序,其中的“事件名”是基类中正在处理的事件的名称。 例如:
Public Class BaseClass Public Event BaseEvent(ByVal i As Integer) ' Place methods and properties here. End Class Public Class DerivedClass Inherits BaseClass Sub EventHandler(ByVal x As Integer) Handles MyBase.BaseEvent ' Place code to handle events from BaseClass here. End Sub End Class
相关章节
标题 |
说明 |
---|---|
提供有关声明和引发类的事件的分步说明。 |
|
演示如何编写事件处理程序过程。 |
|
演示如何定义自定义事件,此事件允许异步调用其事件处理程序。 |
|
演示如何定义只在处理事件时使用内存的自定义事件。 |
|
列出了由继承的组件中的事件处理程序引发的常见问题。 |
|
提供对 .NET Framework 中的事件模型的概述。 |
|
描述如何处理与 Windows 窗体对象关联的事件 |
|
提供对 Visual Basic 中的委托的概述。 |