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

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

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

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

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

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

可以指定 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)

参考

RaiseEvent 语句

Implements 语句

AddHandler 语句

RemoveHandler 语句

Handles 子句 (Visual Basic)

Delegate 语句

Shared (Visual Basic)

Shadows (Visual Basic)

其他资源

事件 (Visual Basic)