Event 语句
声明用户定义的事件。
[ <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 |
可选。应用于此事件的特性列表。多个特性以逗号分隔。特性列表 (Visual Basic)必须用尖括号(“<”和“>”)括起来。 |
accessmodifier |
可选。指定哪个代码可以访问此事件。可以是如下内容之一:
可以指定 Protected Friend,以允许从此事件的类、某个派生类或同一程序集中的代码进行访问。 |
Shared |
可选。指明此事件与类或者结构的特定实例不关联。 |
Shadows |
可选。指明此事件重新声明并隐藏基类中的同名编程元素或重载元素集。可以用其他任何类型的元素来隐藏任何类型的被声明元素。 对于被隐藏的元素来说,从隐藏该元素的派生类无法使用它,除非是从不能访问隐藏元素的位置进行访问。例如,如果 Private 元素隐藏基类元素,无 Private 元素访问权限的代码将访问基类元素。 |
eventname |
必选。事件的名称;符合标准变量命名规则。 |
parameterlist |
可选。局部变量列表,这些变量表示此事件的参数。必须将 参数列表 (Visual Basic) 用括号括起来。 |
Implements |
可选。指示该事件实现了某个接口的事件。 |
implementslist |
如果提供了 Implements 则需要。所实现的 Sub 过程的列表。多个过程之间用逗号隔开: implementedprocedure [ , implementedprocedure ...] 每个 implementedprocedure 均有下列语法和部分: interface.definedname
组成部分说明
interface 必选。此过程的包含类或结构正在实现的接口名称。
definedname 必选。 interface 中定义该过程时使用的名称。该名称不必与 name 相同,后者是此过程用来实现所定义过程的名称。
|
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 委托所需参数匹配的参数列表。必须将 参数列表 (Visual Basic) 用括号括起来。 |
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。这意味着事件的“声明上下文”必须是类、结构、模块或接口,不能是源文件、命名空间、过程或块。有关更多信息,请参见声明上下文和默认访问级别 (Visual Basic)。
大多数情况下,您可以使用本主题“语法”部分的第一个语法声明事件。不过,某些情况下要求对事件的具体行为有更大程度的控制。本主题“语法”部分的最后一个语法使用 Custom 关键字,可以用它定义自定义事件,从而提供了此类控制。在自定义事件中,您可以明确地指定,在代码向事件添加事件处理程序或从事件中移除事件处理程序时,或者在代码引发事件时,将执行什么操作。有关示例,请参见如何:声明自定义事件以节省内存 (Visual Basic)和如何:声明自定义事件以避免阻止 (Visual Basic)。
示例
下面的示例使用事件从 10 到 0 倒数秒。这段代码阐释了几种与事件相关的方法、属性和语句。其中包括 RaiseEvent 语句。
引发事件的类是事件源,而处理事件的方法是事件处理程序。事件源对它生成的事件可以具有多个处理程序。当类引发事件时,将在每一个被选择用来处理该对象实例的事件的类上引发该事件。
本示例还使用一个窗体 (Form1),该窗体具有一个按钮 (Button1) 和一个文本框 (TextBox1)。单击此按钮时,第一个文本框从 10 到 0 秒进行倒计时。全部时间(10 秒)过去后,第一个文本框显示“Done”(完成)。
Form1 的代码指定窗体的初始状态和最终状态。它还包含引发事件时执行的代码。
若要使用此示例,请打开一个新的“Windows 窗体”项目,然后,在名为 Form1 的主窗体中添加名为 Button1 的按钮和名为 TextBox1 的文本框。接着,右击窗体并单击**“查看代码”**以打开代码编辑器。
将 WithEvents 变量添加到 Form1 类的声明部分:
Private WithEvents mText As TimerState
将下面的代码添加到 Form1 的代码中。替换可能存在的任何重复过程,如 Form_Load 或 Button_Click。
Private Sub Form1_Load() Handles MyBase.Load
Button1.Text = "Start"
mText = New TimerState
End Sub
Private Sub Button1_Click() 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 秒)过去后,第一个文本框显示“Done”(完成)。
说明 |
---|
My.Application.DoEvents 方法与窗体处理事件的方式不同。若要允许窗体直接处理事件,可以使用多线程处理。有关更多信息,请参见线程处理(C# 和 Visual Basic)。 |
请参见
任务
如何:声明自定义事件以节省内存 (Visual Basic)
如何:声明自定义事件以避免阻止 (Visual Basic)