RaiseEvent 语句

更新:2007 年 11 月

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

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 访问器。有关自定义事件的更多信息,请参见 Event 语句

示例

下面的示例使用事件来倒计时读秒(从 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(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 键运行前面的示例,然后单击标有“开始”的按钮。第一个文本框将开始倒计时读秒。全部时间(10 秒)过去后,第一个文本框显示“Done”(完成)。

说明:

My.Application.DoEvents 方法不会完全像窗体那样处理事件。若要允许窗体直接处理事件,可以使用多线程处理。有关更多信息,请参见多线程处理 (Visual Basic)

请参见

任务

如何:向类中添加事件

参考

Event 语句

AddHandler 语句

RemoveHandler 语句

Handles

其他资源

事件 (Visual Basic)