事件 (Visual Basic)

雖然您可能會將 Visual Studio 專案以視覺化方式顯示為會依序執行的一系列程序,但實際上,大部分程式都是以事件驅動 (表示執行流程是由稱為「事件」(Event) 的外部發生情況所決定)。

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

事件詞彙和概念

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

宣告事件

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

Event AnEvent(ByVal EventNumber As Integer)

引發事件

事件就像是宣告發生重大事情的訊息。 播送訊息的動作稱為「引發」(Raise) 事件。 在 Visual Basic 中,您可以使用 RaiseEvent 陳述式 (Statement) 引發事件,如以下範例所示:

RaiseEvent AnEvent(EventNumber)

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

事件傳送者

任何能夠引發事件的物件就是「事件發送者」(Event Sender),也稱為「事件來源」(Event Source)。 表單、控制項和使用者定義物件是事件傳送者的幾個範例。

事件處理常式

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

Visual Basic 會將標準命名慣例用於事件處理常式,此慣例結合事件發送者的名稱、底線和事件的名稱。 例如,名為 button1 之按鈕的 Click 事件會命名為 Sub button1_Click。

注意事項注意事項

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

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

在可使用事件處理常式之前,您必須先使用 Handles 或 AddHandler 陳述式,建立該事件處理常式與事件的關聯。

WithEvents 和 Handles 子句

WithEvents 陳述式和 Handles 子句讓您以宣告的方式來指定事件處理常式。 透過任何適用於該事件之具有 Handles 陳述式的程序,即可處理藉由 WithEvents 關鍵字所宣告之物件所引發的事件,如以下範例所示:

' 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 控制共用事件。 同樣地,您也不能使用 WithEvents 或 Handles 處理 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 陳述式 (Statement) 與 Handles 子句類似,兩者都允許您指定事件處理常式。 不過,與 RemoveHandler 搭配使用之 AddHandler 所提供的彈性會比 Handles 子句還大,讓您能動態加入、移除和變更與事件相關聯的事件處理常式。 如果想要處理共用事件或結構中的事件,則必須使用 AddHandler。

AddHandler 使用兩引數:來自事件傳送者 (例如控制項) 的事件名稱,以及評估為委派 (Delegate) 的運算式。 當您使用 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

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

「衍生類別」(Derived Class) 是自基底類別 (Base Class) 繼承特性的類別,能夠使用 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)

提供如何針對類別宣告與引發事件的逐步說明。

逐步解說:處理事件 (Visual Basic)

示範如何撰寫事件處理常式程序。

HOW TO:宣告自訂事件以避免封鎖 (Visual Basic)

示範如何定義允許非同步呼叫事件處理常式的自訂事件。

HOW TO:宣告自訂事件以節省記憶體 (Visual Basic)

示範如何定義只在處理事件時使用記憶體的自訂事件。

Visual Basic 中的繼承事件處理常式疑難排解

列出繼承元件中事件處理常式會產生的常見問題。

處理和引發事件

提供 .NET Framework 中事件模型的概觀。

在 Windows Form 中建立事件處理常式

說明如何使用與 Windows Form 物件關聯的事件。

委派 (Visual Basic)

提供 Visual Basic 中的委派概觀。