Event 语句
更新:2007 年 11 月
声明用户定义的事件。
[ <attrlist> ] [ accessmodifier ] _
[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _
[ Implements implementslist ]
' -or-
[ <attrlist> ] [ accessmodifier ] _
[ Shared ] [ Shadows ] Event eventname As delegatename _
[ Implements implementslist ]
' -or-
[ <attrlist> ] [ accessmodifier ] _
[ Shared ] [ Shadows ] Custom Event eventname As delegatename _
[ Implements implementslist ]
[ <attrlist> ] AddHandler(ByVal value As delegatename)
[ statements ]
End AddHandler
[ <attrlist> ] RemoveHandler(ByVal value As delegatename)
[ statements ]
End RemoveHandler
[ <attrlist> ] RaiseEvent(delegatesignature)
[ statements ]
End RaiseEvent
End Event
各部分说明
部分 |
说明 |
||||||
---|---|---|---|---|---|---|---|
attrlist |
可选。应用于此事件的属性列表。多个属性以逗号分隔。必须将 属性列表 用尖括号(“<”和“>”)括起来。 |
||||||
accessmodifier |
可选。指定哪个代码可以访问此事件。可以是如下内容之一:
可以指定 Protected Friend,以允许从此事件的类、某个派生类或同一程序集中的代码进行访问。 |
||||||
Shared |
可选。指明此事件与类或者结构的特定实例不关联。 |
||||||
Shadows |
可选。指明此事件重新声明并隐藏基类中的同名编程元素或重载元素集。可以用其他任何类型的元素来隐藏任何类型的被声明元素。 对于被隐藏元素来说,从隐藏该元素的派生类无法使用它,除非是从不能访问隐藏元素的位置进行访问。例如,如果 Private 元素隐藏基类元素,无 Private 元素访问权限的代码将访问基类元素。 |
||||||
eventname |
必需。事件的名称;符合标准变量命名规则。 |
||||||
parameterlist |
可选。局部变量列表,这些变量表示此事件的参数。必须将参数列表用括号括起来。 |
||||||
Implements |
可选。指示该事件实现了某个接口的事件。 |
||||||
implementslist |
如果提供了 Implements 则需要。正在实现的 Sub 过程列表。多个过程之间用逗号隔开: implementedprocedure [ , implementedprocedure ... ] 每个 implementedprocedure 均有下列语法和部分: interface.definedname
|
||||||
Custom |
必需。声明为 Custom 的事件必须定义自定义的 AddHandler、RemoveHandler 和 RaiseEvent 访问器。 |
||||||
delegatename |
可选。指定事件处理程序签名的委托名称。 |
||||||
AddHandler |
必需。声明 AddHandler 访问器,它指定通过以下方式添加事件处理程序时应执行的语句:使用 AddHandler 语句显式添加;使用 Handles 子句隐式添加。 |
||||||
End AddHandler |
必需。终止 AddHandler 块。 |
||||||
value |
必需。参数名。 |
||||||
RemoveHandler |
必需。声明 RemoveHandler 访问器,它指定使用 RemoveHandler 语句移除事件处理程序时应执行的语句。 |
||||||
End RemoveHandler |
必需。终止 RemoveHandler 块。 |
||||||
RaiseEvent |
必需。声明 RaiseEvent 访问器,它指定使用 RaiseEvent 语句移除事件时应执行的语句。通常,这会调用由 AddHandler 和 RemoveHandler 访问器维护的委托列表。 |
||||||
End RaiseEvent |
必需。终止 RaiseEvent 块。 |
||||||
delegatesignature |
必需。与 delegatename 委托所需参数匹配的参数列表。必须将 参数列表 用括号括起来。 |
||||||
statements |
可选。包含 AddHandler、RemoveHandler 方法和 RaiseEvent 方法的体的语句。 |
||||||
End Event |
必需。终止 Event 块。 |
备注
声明了事件后,使用 RaiseEvent 语句引发事件。一个典型事件的声明和引发可能如以下片断所示:
Public Class EventSource
' Declare an event.
Public Event LogonCompleted(ByVal UserName As String)
Sub CauseEvent()
' Raise an event on successful logon.
RaiseEvent LogonCompleted("AustinSteele")
End Sub
End Class
说明: |
---|
可以像声明过程参数那样声明事件参数,不同之处为:事件不能具有命名参数、ParamArray 参数或 Optional 参数。事件没有返回值。 |
若要处理事件,必须使用 Handles 或 AddHandler 语句将它与事件处理程序子例程关联起来。子例程的签名必须与事件匹配。若要处理共享事件,必须使用 AddHandler 语句。
仅可以在模块级别使用 Event。这意味着事件的“声明上下文”必须是类、结构、模块或接口,不能是源文件、命名空间、过程或块。 有关更多信息,请参见 声明上下文和默认访问级别。
大多数情况下,您可以使用本主题“语法”部分的第一个语法声明事件。不过,某些情况下要求对事件的具体行为有更大程度的控制。本主题“语法”部分的最后一个语法使用 Custom 关键字,可以用它定义自定义事件,从而提供了此类控制。在自定义事件中,您可以明确地指定,在代码向事件添加事件处理程序或从事件中移除事件处理程序时,或者在代码引发事件时,将执行什么操作。有关示例,请参见 如何:声明保留内存使用的事件 和 如何:声明避免阻止的事件。
示例
下面的示例使用事件来倒计时读秒(从 10 到 0)。这段代码阐释了几种与事件相关的方法、属性和语句。其中包括 RaiseEvent 语句。
引发事件的类是事件源,而处理事件的方法是事件处理程序。事件源对它生成的事件可以具有多个处理程序。当类引发事件时,将在每一个被选择用来处理该对象实例的事件的类上引发该事件。
本示例还使用一个窗体 (Form1),该窗体具有一个按钮 (Button1) 和一个文本框 (TextBox1)。单击按钮时,第一个文本框显示从 10 秒到 0 秒的倒计时。倒计时完成(走完 10 秒)后,第一个文本框显示“完成”。
Form1 的代码指定窗体的初始状态和最终状态。它还包含引发事件时执行的代码。
若要使用此示例,请打开一个新的“Windows 窗体”项目,然后,在名为 Form1 的主窗体中添加名为 Button1 的按钮和名为 TextBox1 的文本框。接着,右击窗体并单击“查看代码”以打开代码编辑器。
将 WithEvents 变量添加到 Form1 类的声明部分:
Private WithEvents mText As TimerState
将下面的代码添加到 Form1 的代码中。替换可能存在的任何重复过程,如 Form_Load 或 Button_Click。
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
Button1.Text = "Start"
mText = New TimerState
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
mText.StartCountdown(10.0, 0.1)
End Sub
Private Sub mText_ChangeText() Handles mText.Finished
TextBox1.Text = "Done"
End Sub
Private Sub mText_UpdateTime(ByVal Countdown As Double) _
Handles mText.UpdateTime
TextBox1.Text = Format(Countdown, "##0.0")
' Use DoEvents to allow the display to refresh.
My.Application.DoEvents()
End Sub
Class TimerState
Public Event UpdateTime(ByVal Countdown As Double)
Public Event Finished()
Public Sub StartCountdown(ByVal Duration As Double, _
ByVal Increment As Double)
Dim Start As Double = DateAndTime.Timer
Dim ElapsedTime As Double = 0
Dim SoFar As Double = 0
Do While ElapsedTime < Duration
If ElapsedTime > SoFar + Increment Then
SoFar += Increment
RaiseEvent UpdateTime(Duration - SoFar)
End If
ElapsedTime = DateAndTime.Timer - Start
Loop
RaiseEvent Finished()
End Sub
End Class
按 F5 键运行前面的示例,然后单击标有“Start”(开始)的按钮。第一个文本框开始倒计秒数。倒计时完成(走完 10 秒)后,第一个文本框显示“完成”。
说明: |
---|
My.Application.DoEvents 方法与窗体处理事件的方式不同。若要允许窗体直接处理事件,可以使用多线程处理。有关更多信息,请参见 多线程处理 (Visual Basic)。 |