共用方式為


事件 (Visual Basic)

雖然您可以將Visual Studio項目可視化為序列中執行的一系列程式,但實際上,大部分的程式都是事件驅動,這表示執行流程是由稱為 事件的外部發生次數所決定。

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

事件詞彙和概念

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

事件宣告

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

Event AnEvent(ByVal EventNumber As Integer)

引發事件

事件就像是一則訊息,指出已發生重要事件。 廣播訊息的行為稱為 引發 事件。 在 Visual Basic 中,您會使用 RaiseEvent 語句引發事件,如下列範例所示:

RaiseEvent AnEvent(EventNumber)

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

事件傳送者

任何能夠引發事件的物件都是 事件傳送者,也稱為 事件來源。 表單、控件和使用者定義物件是事件傳送者的範例。

事件處理程式

事件處理程式 是發生對應事件時所呼叫的程式。 您可以使用任何有效的子程式搭配相符的簽章作為事件處理程式。 不過,您無法使用 函式作為事件處理程式,因為它無法將值傳回至事件來源。

Visual Basic 會針對事件處理程式使用標準命名慣例,以結合事件傳送者的名稱、底線和事件名稱。 例如,Click 名為 button1 的按鈕事件會被命名為 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

語句 AddHandlerHandles 中的 子句類似,這兩者都可讓您指定事件處理程式。 不過, AddHandler搭配 RemoveHandler使用 時,提供比 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 Forms 中建立事件處理程式 描述如何處理與 Windows Forms 物件相關聯的事件。
代表 提供 Visual Basic 中的委派概觀。