事件 (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
。
注意
我們建議您在為自己的事件定義事件處理常式時,使用此命名慣例,但這並非必要;您可以使用任何有效的副程式名稱。
建立事件與事件處理常式的關聯
讓事件處理常式變成可用之前,您必須先使用 Handles
或 AddHandler
陳述式來建立它與事件的關聯。
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
,以宣告方式處理共用的事件。 同樣地,您不能使用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
陳述式類似 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 中的委派概觀。 |