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.FormClick事件,不能在RaiseEvent派生窗体中引发该事件。 如果在窗体模块中声明事件 Click ,它将隐藏窗体自己的 Click 事件。 你仍可以通过调用该方法来调用OnClick窗体Click的事件。

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

注释

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

注释

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

示例 1

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

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

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

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

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

将变量 WithEvents 添加到类的 Form1 声明部分。

Private WithEvents mText As TimerState

示例 2

将以下代码添加到代码中 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 运行前面的示例,然后单击标记为 “开始”按钮。 第一个文本框开始倒计时秒。 当全职(10 秒)已用完时,第一个文本框将显示“完成”。

注释

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

另请参阅