事件是某个动作或事件(如鼠标单击或信用额度超限),被程序组件识别,并且可以编写代码来响应。 事件处理程序是你为响应事件而编写的代码。
在 Visual Basic 中,处理事件有两个方面:
- 事件发布 - 类使用 RaiseEvent 语句声明事件,并在发生有趣的事情时引发事件。 这是实际调用事件处理程序的内容。
-
事件订阅 — 通过将方法标识为特定事件的事件处理器来订阅事件。 可以使用
Handles子句和WithEvents变量,或者使用 AddHandler 语句来实现此操作。
Visual Basic 中的事件处理程序是一个 Sub 过程。 代码不直接像其他 Sub 过程那样调用它。 相反,事件发布方在触发事件时调用该过程,因为该过程已订阅此事件。
订阅 Visual Basic 中的事件的默认方法是使用 Handles 子句。 这是在集成开发环境(IDE)中编程时设计器编写事件处理程序的方式。 该 AddHandler 语句非常适合在运行时动态订阅事件。
事件发生时,Visual Basic 会自动调用事件处理程序过程。 任何有权访问事件的代码都可能导致它通过执行 RaiseEvent 语句来发生。
可以将多个事件处理程序与同一事件相关联。 在某些情况下,可以将处理程序与事件取消关联。 有关详细信息,请参阅 事件。
使用 Handles 和 WithEvents 订阅事件
确保事件是使用 事件语句声明的。
使用
WithEvents关键字在模块或类级别声明对象变量。 此变量的As子句必须指定引发事件的类。在事件处理
Sub过程的声明中,添加一个Handles指定WithEvents变量和事件名称的子句。事件发生时,Visual Basic 会自动调用
Sub该过程。 代码可以使用RaiseEvent语句引发事件并调用所有订阅的处理程序。以下示例定义一个事件和一个
WithEvents引用引发事件的类的变量。 事件处理Sub过程使用子Handles句来指定它处理的类和事件。' Example showing event handling with Handles and WithEvents Public Class EventPublisher Public Event SomethingHappened() Public Sub CauseEvent() ' Raise the event when something interesting happens RaiseEvent SomethingHappened() End Sub End Class Public Class EventSubscriber ' Declare a WithEvents variable Dim WithEvents eventObj As New EventPublisher ' Handle the event using Handles clause Public Sub ProcessHappen() Handles eventObj.SomethingHappened ' Insert code to handle somethingHappened event. Console.WriteLine("Event handled using Handles clause!") End Sub Public Sub TriggerEvent() eventObj.CauseEvent() End Sub End Class
使用 AddHandler 订阅事件
请确保使用
Event语句声明事件。执行 AddHandler 语句 ,以动态连接事件处理
Sub过程与事件。事件发生时,Visual Basic 会自动调用
Sub该过程。 代码可以使用RaiseEvent语句引发事件并调用所有订阅的处理程序。以下示例使用构造函数中的 AddHandler 语句 将
OnTimerElapsed过程关联为自定义计时器事件的事件处理程序。' Example showing event handling with AddHandler Public Class Timer Public Event TimerElapsed(ByVal message As String) Public Sub Start() ' Simulate timer elapsed RaiseEvent TimerElapsed("Timer has elapsed!") End Sub End Class Public Class Application Private appTimer As New Timer() Sub New() ' Use AddHandler to dynamically associate event handler AddHandler appTimer.TimerElapsed, AddressOf OnTimerElapsed End Sub Private Sub OnTimerElapsed(ByVal message As String) ' Insert code to handle timer elapsed event Console.WriteLine($"Handling timer event: {message}") End Sub Public Sub StartTimer() appTimer.Start() End Sub End Class可以通过执行 RemoveHandler 语句将事件处理程序与事件解除关联。