事件语句

声明用户定义的事件。

语法

[ <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  

部件

部件 DESCRIPTION
attrlist 可选。 应用于此事件的属性列表。 多个属性用逗号分隔。 必须将 属性列表 括在尖括号(“<”和“)>中。
accessmodifier 可选。 指定哪些代码可以访问该事件。 可以是以下值之一:

- 公共 - 可访问声明该元素的任何代码都可以访问它。
- 受保护 - 只有其类中的代码或派生类才能访问它。
- 友元 - 只有同一程序集中的代码可以访问它。
- Private - 只有声明它才能访问它的元素中的代码。
- 事件类、派生类或同一程序集中受保护的仅友元代码可以访问它。
- 事件类中的专用受保护代码或同一程序集中的派生类可以访问它。
Shared 可选。 指定此事件不与类或结构的特定实例关联。
Shadows 可选。 指示此事件在基类中重新声明并隐藏同名编程元素或重载元素集。 可以使用任何其他类型隐藏任何类型的声明元素。

阴影元素在派生类中不可用,但阴影元素不可访问的位置除外。 例如,如果 Private 元素隐藏基类元素,则无权访问该元素的代码将改为访问 Private 基类元素。
eventname 必填。 事件的名称;遵循标准变量命名约定。
parameterlist 可选。 表示此事件的参数的局部变量列表。 必须将 参数列表 括在括号中。
Implements 可选。 指示此事件实现接口的事件。
implementslist 如果 Implements 已提供,则为必需。 Sub正在实现的过程列表。 多个过程用逗号分隔:

implementedprocedure [ , implementedprocedure ... ]

每个 implementedprocedure 语法和部分都具有以下语法和部分:

interface.definedname

- interface -必填。 此过程包含类或结构的接口的名称。
- Definedname -必填。 在其中定义 interface过程的名称。 这不必与 name此过程用于实现定义的过程的名称相同。
Custom 必填。 声明为Custom必须定义自定义AddHandlerRemoveHandlerRaiseEvent访问器的事件。
delegatename 可选。 指定事件处理程序签名的委托的名称。
AddHandler 必填。 声明访问 AddHandler 器,该访问器指定要在添加事件处理程序时执行的语句,该语句是显式使用 AddHandler 语句,还是通过使用 Handles 子句隐式执行。
End AddHandler 必填。 终止 AddHandler 块。
value 必填。 参数名称。
RemoveHandler 必填。 声明访问 RemoveHandler 器,该访问器指定使用 RemoveHandler 语句删除事件处理程序时要执行的语句。
End RemoveHandler 必填。 终止 RemoveHandler 块。
RaiseEvent 必填。 声明访问 RaiseEvent 器,该访问器指定使用 RaiseEvent 语句引发事件时要执行的语句。 通常,这会调用由访问RemoveHandler器和访问器维护的AddHandler委托列表。
End RaiseEvent 必填。 终止 RaiseEvent 块。
delegatesignature 必填。 与委托所需的 delegatename 参数匹配的参数列表。 必须将 参数列表 括在括号中。
statements 可选。 包含和方法的AddHandlerRemoveHandlerRaiseEvent主体的语句。
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 参数。 事件没有返回值。

若要处理事件,必须使用 or AddHandler 语句将其与事件处理程序子例程Handles相关联。 子例程和事件的签名必须匹配。 若要处理共享事件,必须使用 AddHandler 该语句。

只能在模块级别使用 Event 。 这意味着事件的 声明上下文 必须是类、结构、模块或接口,不能是源文件、命名空间、过程或块。 有关详细信息,请参阅 声明上下文和默认访问级别

在大多数情况下,可以使用本主题的“语法”部分中的第一个语法来声明事件。 但是,某些方案要求你更好地控制事件的详细行为。 本主题语法部分中的最后一个语法,该语法使用 Custom 关键字,通过使你能够定义自定义事件来提供该控件。 在自定义事件中,可以指定在代码向事件添加或删除事件处理程序时或代码引发事件时所发生的情况。 有关示例,请参阅 “如何:声明自定义事件以节省内存 ”和 “如何:声明自定义事件以避免阻止”。

示例:

以下示例使用事件将秒数从 10 倒计时为 0。 该代码演示了多个与事件相关的方法、属性和语句。 这包括 RaiseEvent 语句。

引发事件的类是事件源,处理事件的方法是事件处理程序。 事件源可以为其生成的事件具有多个处理程序。 当类引发事件时,该事件在已选择处理该对象的实例的每个类上引发。

该示例还使用窗体(Form1)和按钮(Button1)和文本框(TextBox1)。 单击该按钮时,第一个文本框将显示从 10 到 0 秒的倒计时。 当全职(10 秒)已用完时,第一个文本框将显示“完成”。

用于 Form1 指定窗体的初始状态和终端状态的代码。 它还包含在引发事件时执行的代码。

若要使用此示例,请打开一个新的 Windows 窗体项目。 然后添加一个命名Button1按钮,并添加一个名为TextBox1主窗体的文本框。Form1 然后右键单击窗体,然后单击“ 查看代码 ”以打开代码编辑器。

将变量 WithEvents 添加到类的 Form1 声明节:

Private WithEvents mText As TimerState

将以下代码添加到代码中 Form1。 替换可能存在的任何重复过程,例如 Form_LoadButton_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 运行上一个示例,然后单击标记为 “开始”按钮。 第一个文本框开始倒计时秒。 当全职(10 秒)已用完时,第一个文本框将显示“完成”。

注释

该方法 My.Application.DoEvents 不会以与表单处理事件的方式相同。 若要使表单能够直接处理事件,可以使用多线程处理。 有关详细信息,请参阅 托管线程处理

另请参阅