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

可选。指定哪个代码可以访问此事件。可以是如下内容之一:

  • Public — 可以访问声明此枚举的元素的任何代码。

  • Protected — 仅限于此枚举的类或某个派生类中的代码。

  • Friend — 仅限于同一程序集中的代码。

  • Private — 仅限于声明此事件的元素中的代码。

可以指定 Protected Friend,以允许从此事件的类、某个派生类或同一程序集中的代码进行访问。

Shared

可选。指明此事件与类或者结构的特定实例不关联。

Shadows

可选。指明此事件重新声明并隐藏基类中的同名编程元素或重载元素集。可以用其他任何类型的元素来隐藏任何类型的被声明元素。

对于被隐藏元素来说,从隐藏该元素的派生类无法使用它,除非是从不能访问隐藏元素的位置进行访问。例如,如果 Private 元素隐藏基类元素,无 Private 元素访问权限的代码将访问基类元素。

eventname

必需。事件的名称;符合标准变量命名规则。

parameterlist

可选。局部变量列表,这些变量表示此事件的参数。必须将参数列表用括号括起来。

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 委托所需参数匹配的参数列表。必须将 参数列表 用括号括起来。

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)

请参见

任务

如何:向类中添加事件

如何:声明保留内存使用的事件

如何:声明避免阻止的事件

参考

RaiseEvent 语句

Implements 语句

AddHandler 语句

RemoveHandler 语句

Handles

Delegate 语句

Shared (Visual Basic)

Shadows

其他资源

事件 (Visual Basic)