共用方式為


如何在 Visual Basic 中訂閱事件並處理它們

事件是動作或事件,例如滑鼠點擊或信用額度超過,可被某些程式元件辨識,而且您可以撰寫程式碼來回應。 事件處理程式是您撰寫以回應事件的程序代碼。

在 Visual Basic 中,處理事件有兩個層面:

  • 事件發佈 — 類別宣告事件,並在遇到重要事件時,使用 RaiseEvent 陳述式 引發事件。 這是實際呼叫事件處理程序的內容。
  • 事件訂閱 — 您可以透過將程序識別為特定事件的處理常式來訂閱事件。 您可以使用Handles子句和WithEvents變數,或使用AddHandler 語句來執行此動作。

Visual Basic 中的事件處理程式是一個 Sub 程式。 您的程式碼不會像其他 Sub 程序一樣直接呼叫它。 相反地,事件發行者會在引發事件時叫用程序,因為程序已訂閱事件。

使用 Handles 子句是在 Visual Basic 中訂閱事件的預設方式。 這就是設計人員在整合開發環境 (IDE) 中進行程式設計時撰寫事件處理常式的方式。 此 AddHandler 語句適用於在運行時動態訂閱事件。

事件發生時,Visual Basic 會自動呼叫事件處理程式程式。 任何可存取事件的程式碼,都可以藉由執行 RaiseEvent 語句來觸發事件。

您可以將多個事件處理程式與相同的事件產生關聯。 在某些情況下,您可以將處理程式與事件解除關聯。 如需詳細資訊,請參閱 事件

使用 Handles 和 WithEvents 訂閱事件

  1. 請確定事件是以 Event 語句宣告。

  2. 使用 WithEvents 關鍵詞,在模組或類別層級宣告物件變數。 這個 As 變數的 子句必須指定引發事件的類別。

  3. 在事件處理 Sub 程式的宣告中,加入指定Handles變數和事件名稱的WithEvents子句。

  4. 事件發生時,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 訂閱事件

  1. 請確定該事件已使用 Event 語句宣告。

  2. 執行 AddHandler 語句 ,以動態方式將事件處理程式 Sub 與事件連接。

  3. 事件發生時,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 語句,將事件處理程式與事件解除關聯。

另請參閱