Vb.net 事件
代码示例
Sub TestEvents()
Dim Obj As New Class1 ' 实例化类
AddHandler Obj.Ev_Event, AddressOf EventHandler ' 关联事件
Obj.CauseSomeEvent() ' 调用对象方法,将引发事件处理
RemoveHandler Obj.Ev_Event, AddressOf EventHandler ' 取消关联,停止事件处理
Obj.CauseSomeEvent() ' 调用对象方法,不会引发事件处理
End Sub
Sub EventHandler()
MsgBox("EventHandler caught event.") ' 处理事件
End Sub
Public Class Class1
Public Event Ev_Event() ' 声明事件
Sub CauseSomeEvent()
RaiseEvent Ev_Event() ' 引发事件
End Sub
End Class
事件处理过程
事件
事件是用来告知应用程序,一些重要的事情的发生。
事件发送器
一个可以引发一个事件的对象是一个事件发送器。
事件的声明
在类中,事件的声明是用关键字Event来进行的:
Event AnEvent(Byval EventNumber As Integer)
事件的引发
事件就象一件非常重要的事情发生了,而宣布这件重要的事情的行为就叫做事件的引发。事件必须使用RaiseEvent关键字来引发。下面的例子引发了一个名为AnEvent的事件:
RaiseEvent AnEvent(EventNumber)
事件的处理
事件的处理是当一个相关事件发生以后调用的一个过程。
把事件和事件处理联系起来
在一个事件处理可以使用之前,用户需要把它和一个事件用WithEvents或者AddHandler联系起来。
给一个类加事件
用户可以通过使用Events表述来声明一个类的事件,声明包含了事件的名称和参数。例:
Public Event PercentDone(Byval Percent AS Single,_
ByRefCancel As Boolean)
事件总是被声明为公有的,而且,事件没有返回值、可选参数或者数组参数。
给一个类加一个事件说明了只要是这种类的对象就能够引发这种特定的事件,用户需要使用RaiseEvent表述来让一个事件真正运行起来,一旦事件运行起来以后,用户就可以使用WithEvents或者AddHandler把事件和事件处理过程联系起来。
相关关键字:
Handles
声明某个过程处理一个指定事件。
proceduredeclaration Handles eventlist
Proceduredeclaration:将处理事件的过程的 Sub 过程声明。
Eventlist:要处理的 proceduredeclaration 的事件的列表。此事件必须由当前类的基类或已使用 WithEvents 关键字声明的对象引发。
AddHandler
在运行时将事件与事件处理程序相关联。
AddHandler event, AddressOf eventhandler
event :要处理的事件的名称。
eventhandler :将处理事件的过程的名称。
AddHandler 和 RemoveHandler 语句使您可以在程序执行过程中的任何时候启动和停止事件处理。
Handles 关键字和 AddHandler 语句都允许您指定特定过程处理特定事件,但有一些不同。AddHandler 语句在运行时将过程连接到事件。
Event
声明用户定义的事件。
可以像声明过程参数那样声明事件参数,不同之处为:事件不能具有命名参数、ParamArray 参数或 Optional 参数。事件没有返回值。
RaiseEvent
触发类、窗体或文档中在模块级声明的事件。
RaiseEvent eventname[( argumentlist )]
eventname
必选。要触发的事件的名称。
argumentlist
可选。以逗号分隔的变量、数组或表达式的列表。
WithEvent
指定一个或多个已声明成员变量引用可引发事件的类的实例。
当某个变量是使用 WithEvents 定义时,您可以用声明方式指定某个方法使用 Handles 关键字处理该变量的事件。只能使用 WithEvents 声明单个变量,不能声明数组。
事件关联的两种方式AddHandler 比较
WithEvents 语句和 Handles 子句提供了陈述性指定事件处理程序的方法。WithEvents 所声明对象引发的事件可以由任何子例程用命名此事件的 Handles 子句来处理。虽然 Handles 子句是关联事件与事件处理程序的标准方法,它仅限于在编译时关联事件与事件处理程序。
例:
Dim WithEvents EClass As New EventClass
Sub TestEvents()
EClass.RaiseEvents()
End Sub
Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent
MsgBox("Received Event.")
End Sub
Class EventClass
Public Event XEvent()
Public Event YEvent()
Sub RaiseEvents()
RaiseEvent XEvent()
RaiseEvent YEvent()
End Sub
End Class
注意:
不能把 WithEvents 变量用作对象变量。即,不能将它声明为 Object,在声明变量时必须指定类名称。
不能创建 WithEvents 变量数组。
AddHandler 和 RemoveHandler 语句要比 Handles 子句更灵活。它们允许在运行时动态地将事件与一个或更多的事件处理程序连接或者断开,而并不要求使用 WithEvents 来声明对象变量。
例:
Public Sub EHandler(ByVal EventNumber As Integer)
MsgBox("Received event number " & CStr(EventNumber))
End Sub
Public Sub TestAddHandler()
Dim CI As New Class1
End Sub
AddHandler CI.AnEvent, AddressOf EHandler