事件是動作或事件,例如滑鼠點擊或信用額度超過,可被某些程式元件辨識,而且您可以撰寫程式碼來回應。 事件處理程式是您撰寫以回應事件的程序代碼。
在 Visual Basic 中,處理事件有兩個層面:
- 事件發佈 — 類別宣告事件,並在遇到重要事件時,使用 RaiseEvent 陳述式 引發事件。 這是實際呼叫事件處理程序的內容。
-
事件訂閱 — 您可以透過將程序識別為特定事件的處理常式來訂閱事件。 您可以使用
Handles子句和WithEvents變數,或使用AddHandler 語句來執行此動作。
Visual Basic 中的事件處理程式是一個 Sub 程式。 您的程式碼不會像其他 Sub 程序一樣直接呼叫它。 相反地,事件發行者會在引發事件時叫用程序,因為程序已訂閱事件。
使用 Handles 子句是在 Visual Basic 中訂閱事件的預設方式。 這就是設計人員在整合開發環境 (IDE) 中進行程式設計時撰寫事件處理常式的方式。 此 AddHandler 語句適用於在運行時動態訂閱事件。
事件發生時,Visual Basic 會自動呼叫事件處理程式程式。 任何可存取事件的程式碼,都可以藉由執行 RaiseEvent 語句來觸發事件。
您可以將多個事件處理程式與相同的事件產生關聯。 在某些情況下,您可以將處理程式與事件解除關聯。 如需詳細資訊,請參閱 事件。
使用 Handles 和 WithEvents 訂閱事件
請確定事件是以 Event 語句宣告。
使用
WithEvents關鍵詞,在模組或類別層級宣告物件變數。 這個As變數的 子句必須指定引發事件的類別。在事件處理
Sub程式的宣告中,加入指定Handles變數和事件名稱的WithEvents子句。事件發生時,Visual Basic 會自動呼叫
Sub程式。 您的程式碼可以使用RaiseEvent陳述式來引發事件,並叫用所有訂閱的處理常式。下列範例定義了一個事件以及一個變數
WithEvents,此變數指向觸發該事件的類別。 事件處理程式Sub會使用Handles子句來指定其處理的類別和事件。' Example showing event handling with Handles and WithEvents Public Class EventPublisher Public Event SomethingHappened() Public Sub CauseEvent() ' Raise the event when something interesting happens RaiseEvent SomethingHappened() End Sub End Class Public Class EventSubscriber ' Declare a WithEvents variable Dim WithEvents eventObj As New EventPublisher ' Handle the event using Handles clause Public Sub ProcessHappen() Handles eventObj.SomethingHappened ' Insert code to handle somethingHappened event. Console.WriteLine("Event handled using Handles clause!") End Sub Public Sub TriggerEvent() eventObj.CauseEvent() End Sub End Class
使用 AddHandler 訂閱事件
請確定該事件已使用
Event語句宣告。執行 AddHandler 語句 ,以動態方式將事件處理程式
Sub與事件連接。事件發生時,Visual Basic 會自動呼叫
Sub程式。 您的程式碼可以使用RaiseEvent陳述式來引發事件,並叫用所有訂閱的處理常式。下列範例會使用建構函式中的 AddHandler 陳述式 ,將程式建立關聯
OnTimerElapsed為自訂計時器事件的事件處理常式。' Example showing event handling with AddHandler Public Class Timer Public Event TimerElapsed(ByVal message As String) Public Sub Start() ' Simulate timer elapsed RaiseEvent TimerElapsed("Timer has elapsed!") End Sub End Class Public Class Application Private appTimer As New Timer() Sub New() ' Use AddHandler to dynamically associate event handler AddHandler appTimer.TimerElapsed, AddressOf OnTimerElapsed End Sub Private Sub OnTimerElapsed(ByVal message As String) ' Insert code to handle timer elapsed event Console.WriteLine($"Handling timer event: {message}") End Sub Public Sub StartTimer() appTimer.Start() End Sub End Class您可以藉由執行 RemoveHandler 語句,將事件處理程式與事件解除關聯。