事件 (Visual Basic)

雖然您可以將 Visual Studio 專案視覺化為一系列以循序執行的程式,但實際上,大部分的程式都是事件驅動的,也就是說,執行流程是由稱為「 事件」的外部出現專案所決定。

事件是通知應用程式發生重要事件的信號。 例如,當使用者按一下表單上的控制項時,表單可以引發 Click 事件,並呼叫處理事件的程序。 事件也允許個別工作進行通訊。 例如,假設您的應用程式與主應用程式個別執行排序工作。 如果使用者取消排序,則您的應用程式可以傳送取消事件,以指示排序處理序停止。

事件詞彙和概念

本節說明 Visual Basic 中的事件所使用的詞彙和概念。

宣告事件

您可以在類別、結構、模組和介面內,使用 Event 關鍵字宣告事件,如下列範例所示:

Event AnEvent(ByVal EventNumber As Integer)

引發事件

事件就像是訊息,會告知發生了重要事件。 廣播訊息的動作稱為「引發」事件。 在 Visual Basic 中,您會使用語句引發事件 RaiseEvent ,如下列範例所示:

RaiseEvent AnEvent(EventNumber)

事件必須在其宣告所在的類別、模組或結構範圍內引發。 例如,衍生的類別無法引發繼承自基底類別的事件。

事件傳送者

任何可引發事件的物件都是「事件傳送者」,亦稱為「事件來源」。 表單、控制項和使用者定義的物件都是事件傳送者的範例。

事件處理常式

「事件處理常式」是在發生相對應事件時所呼叫的程序。 您可以使用具有相符簽章的任何有效副程式,做為事件處理常式。 不過,您無法使用函式做為事件處理常式,因為它無法將值傳回事件來源。

Visual Basic 針對事件處理常式使用標準命名慣例,其結合了事件寄件者的名稱、底線和事件的名稱。 例如,將名為 button1 的按鈕 Click 事件命名為 Sub button1_Click

注意

我們建議您在為自己的事件定義事件處理常式時,使用此命名慣例,但這並非必要;您可以使用任何有效的副程式名稱。

建立事件與事件處理常式的關聯

讓事件處理常式變成可用之前,您必須先使用 HandlesAddHandler 陳述式來建立它與事件的關聯。

WithEvents 和 Handles 子句

WithEvents 陳述式和 Handles 子句提供一種宣告式方式來指定事件處理常式。 使用 WithEvents 關鍵字宣告之物件所引發的事件可以透過任何具有 Handles 陳述式的程序來處理,如下列範例所示:

' Declare a WithEvents variable.
Dim WithEvents EClass As New EventClass

' Call the method that raises the object's events.
Sub TestEvents()
    EClass.RaiseEvents()
End Sub

' Declare an event handler that handles multiple events.
Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent
    MsgBox("Received Event.")
End Sub

Class EventClass
    Public Event XEvent()
    Public Event YEvent()
    ' RaiseEvents raises both events.
    Sub RaiseEvents()
        RaiseEvent XEvent()
        RaiseEvent YEvent()
    End Sub
End Class

WithEvents 陳述式和 Handles 子句通常是事件處理常式的最佳選擇,因為它們使用的宣告式語法讓事件能夠更容易處理程式碼、讀取及偵錯。 不過,請注意下列有關使用 WithEvents 變數的限制:

  • 您不能使用 WithEvents 變數做為物件變數。 也就是說,您無法將它宣告為 Object - 當您宣告變數時,必須指定類別名稱。

  • 因為共用事件未系結至類別實例,所以您無法使用 WithEvents 以宣告方式處理共用事件。 同樣地,您不能使用 WithEventsHandles,處理來自 Structure 的事件。 在這兩種情況下,您可以使用 AddHandler 陳述式來處理這些事件。

  • 您無法建立 WithEvents 變數的陣列。

WithEvents 變數可讓單一事件處理常式處理一或多種事件,或者讓一或多個事件處理常式處理相同種類的事件。

雖然 Handles 子句是建立事件與事件處理常式之關聯的標準方式,但它只能在編譯時期建立事件與事件處理常式的關聯。

在某些情況下(例如,使用與表單或控制項相關聯的事件),Visual Basic 會自動將空的事件處理常式存根,並將它與事件產生關聯。 例如,當您在設計模式中,按兩下表單上的命令按鈕時,Visual Basic 會建立空的事件處理常式和 WithEvents 命令按鈕的變數,如下列程式碼所示:

Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub

AddHandler 和 RemoveHandler

AddHandler 陳述式類似 Handles 子句,這兩者都能讓您指定事件處理常式。 不過,與 RemoveHandler 搭配使用的 AddHandler 所提供的彈性比 Handles 子句更大,可讓您以動態方式加入、移除及變更與事件相關聯的事件處理常式。 如果您想要處理共用的事件或來自結構的事件,就必須使用 AddHandler

AddHandler 會採用兩個引數︰來自事件傳送者的事件名稱 (例如控制項),以及評估委派的運算式。 使用 AddHandler 時,您不需明確指定委派類別,因為 AddressOf 陳述式一律會傳回對委派的參考。 下列範例會建立事件處理常式與物件所引發之事件的關聯:

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

RemoveHandler (其會中斷事件與事件處理常式的關聯) 會使用與 AddHandler 相同的語法。 例如:

RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

在下列範例中,事件處理常式會與事件相關聯,並引發事件。 事件處理常式會攔截事件,並顯示一則訊息。

接著,移除第一個事件處理常式,並將不同的事件處理常式關聯至該事件。 再次引發事件時,即會顯示不同的訊息。

最後,移除第二個事件處理常式,然後第三次引發事件。 由於不再有與事件相關聯的事件處理常式,因此不會採取任何動作。

Module Module1

    Sub Main()
        Dim c1 As New Class1
        ' Associate an event handler with an event.
        AddHandler c1.AnEvent, AddressOf EventHandler1
        ' Call a method to raise the event.
        c1.CauseTheEvent()
        ' Stop handling the event.
        RemoveHandler c1.AnEvent, AddressOf EventHandler1
        ' Now associate a different event handler with the event.
        AddHandler c1.AnEvent, AddressOf EventHandler2
        ' Call a method to raise the event.
        c1.CauseTheEvent()
        ' Stop handling the event.
        RemoveHandler c1.AnEvent, AddressOf EventHandler2
        ' This event will not be handled.
        c1.CauseTheEvent()
    End Sub

    Sub EventHandler1()
        ' Handle the event.
        MsgBox("EventHandler1 caught event.")
    End Sub

    Sub EventHandler2()
        ' Handle the event.
        MsgBox("EventHandler2 caught event.")
    End Sub

    Public Class Class1
        ' Declare an event.
        Public Event AnEvent()
        Sub CauseTheEvent()
            ' Raise an event.
            RaiseEvent AnEvent()
        End Sub
    End Class

End Module

處理繼承自基底類別的事件

「衍生類別」(繼承基底類別特性的類別) 可以使用 Handles MyBase 陳述式,來處理其基底類別所引發的事件。

處理來自基底類別的事件

  • 在衍生類別中宣告事件處理常式,方法是將 Handles MyBase.eventname 陳述式加入至事件處理常式程序的宣告行中,其中 eventname 為您要處理之基底類別中的事件名稱。 例如:

    Public Class BaseClass
        Public Event BaseEvent(ByVal i As Integer)
        ' Place methods and properties here.
    End Class
    
    Public Class DerivedClass
        Inherits BaseClass
        Sub EventHandler(ByVal x As Integer) Handles MyBase.BaseEvent
            ' Place code to handle events from BaseClass here.
        End Sub
    End Class
    
標題 描述
逐步解說:宣告和引發事件 提供如何宣告和引發類別事件的逐步說明。
逐步解說:處理事件 示範如何撰寫事件處理常式的程序。
如何:宣告自訂事件以避免封鎖 示範如何定義自訂事件,以非同步方式呼叫它的事件處理常式。
如何:宣告自訂事件以節省記憶體 示範如何定義只有在處理事件時才會使用記憶體的自訂事件。
Visual Basic 中的繼承事件處理常式疑難排解 列出繼承元件中的事件處理常式所引發的常見問題。
事件 提供 .NET Framework 中事件模型的概觀。
在 Windows Form 中建立事件處理常式 描述如何使用與 Windows Form 物件相關聯的事件。
委派 提供 Visual Basic 中的委派概觀。