雖然您可以將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。
備註
建議您在定義您自己的事件事件處理程式時使用此命名慣例,但並非必要;您可以使用任何有效的子程式名稱。
將事件與事件處理程式產生關聯
在事件處理程式變成可用之前,您必須先使用 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 中的 子句類似,這兩者都可讓您指定事件處理程式。 不過, 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 中的委派概觀。 |