RaiseEvent 语句

在类、窗体或文档中触发在模块级别声明的事件。

语法

RaiseEvent eventname[( argumentlist )]  

组成部分

eventname
必需。 要触发的事件的名称。

argumentlist
可选。 以逗号分隔的变量、数组或表达式列表。 argumentlist 参数必须括在括号中。 如果没有任何自变量,则必须省略括号。

注解

必需的 eventname 是在模块中声明的事件的名称。 它遵循 Visual Basic 变量命名约定。

如果未在引发事件的模块中声明该事件,则发生错误。 下面的代码片段演示了一个事件声明和一个引发事件的过程。

' Declare an event at module level.
Event LogonCompleted(ByVal UserName As String)

Sub Logon(ByVal UserName As String)
    ' Raise the event.
    RaiseEvent LogonCompleted(UserName)
End Sub

不能使用 RaiseEvent 引发未在模块中显式声明的事件。 例如,所有窗体都从 System.Windows.Forms.Form 继承事件 Click,无法在派生窗体中使用 RaiseEvent 引发该事件。 如果在窗体模块中声明 Click 事件,它将隐藏窗体自己的 Click 事件。 仍可以通过调用 OnClick 方法调用窗体的 Click 事件。

默认情况下,Visual Basic 中定义的事件按照建立连接的顺序引发其事件处理程序。 由于事件可以具有 ByRef 参数,因此后期连接的进程可能会接收由早期事件处理程序更改的参数。 执行事件处理程序后,控制权将返回引发事件的子例程。

注意

非共享事件不应在声明其类的构造函数中引发。 尽管此类事件不会导致运行时错误,但相关事件处理程序可能无法将其捕获。 如果需要从构造函数引发事件,请使用 Shared 修饰符创建共享事件。

注意

可以通过定义自定义事件来更改事件的默认行为。 对于自定义事件,RaiseEvent 语句调用事件的 RaiseEvent 访问器。 有关自定义事件的详细信息,请参阅事件语句

示例 1

下面的示例使用事件从 10 秒到 0 秒进行倒计时。 代码演示了几个与事件相关的方法、属性和语句,包括 RaiseEvent 语句。

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

该示例还使用一个窗体 (Form1),其中包含一个按钮 (Button1) 和一个文本框 (TextBox1)。 单击该按钮时,第一个文本框显示从 10 秒到 0 秒的倒计时。 经过了全部时间(10 秒)之后,第一个文本框会显示“Done”。

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

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

Form1 类的声明部分添加一个 WithEvents 变量。

Private WithEvents mText As TimerState

示例 2

将下面的代码添加到 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 以运行上述示例,然后单击标记为“Start”的按钮。 第一个文本框中开始倒计时秒数。 经过了全部时间(10 秒)之后,第一个文本框会显示“Done”。

备注

My.Application.DoEvents 方法不会按照与窗体相同的方式来处理事件。 若要使窗体可以直接处理事件,你可以使用多线程处理。 有关详细信息,请参阅托管线程处理

请参阅