共用方式為


事件語句

宣告使用者定義事件。

語法

[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _  
[ Implements implementslist ]  
' -or-  
[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname As delegatename _  
[ Implements implementslist ]  
' -or-  
 [ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Custom Event eventname As delegatename _  
[ Implements implementslist ]  
   [ <attrlist> ] AddHandler(ByVal value As delegatename)  
      [ statements ]  
   End AddHandler  
   [ <attrlist> ] RemoveHandler(ByVal value As delegatename)  
      [ statements ]  
   End RemoveHandler  
   [ <attrlist> ] RaiseEvent(delegatesignature)  
      [ statements ]  
   End RaiseEvent  
End Event  

組件

部分 說明
attrlist 選擇性。 套用至此事件的屬性清單。 多個屬性會以逗號分隔。 您必須以角括弧 (“”< 和 “>”) 括住屬性清單
accessmodifier 選擇性。 指定哪些程式代碼可以存取事件。 可以是下列其中一項:

- Public-任何可存取宣告其項目的程式代碼都可以存取它。
- Protected— 只有其類別內的程式代碼或衍生類別可以存取它。
- Friend - 只有相同元件中的程式代碼可以存取它。
- Private — 只有宣告它的專案中的程式代碼可以存取它。
- 事件類別、衍生類別或相同元件中受保護的Friend專用程式代碼可以存取它。
- 事件類別或相同元件中衍生類別中的私人受保護專用程序代碼可以存取它。
Shared 選擇性。 指定這個事件與類別或結構的特定實例無關。
Shadows 選擇性。 指出此事件會重新宣告並隱藏基類中名稱相同的程式設計專案或一組多載專案。 您可以使用任何其他類型來遮蔽任何類型的宣告專案。

陰影項目無法從遮蔽它的衍生類別內取得,但無法存取陰影專案的位置除外。 例如,如果 Private 專案會遮蔽基類專案,則沒有存取專案許可權的程式代碼會改為存取 Private 基類專案。
eventname 必須的。 事件的名稱;遵循標準變數命名慣例。
parameterlist 選擇性。 代表此事件參數的局部變數清單。 您必須以括弧括住 參數清單
Implements 選擇性。 表示此事件會實作介面的事件。
implementslist 如果 Implements 提供,則為必要。 正在實作 Sub 的程式清單。 多個程式會以逗號分隔:

implementedprocedure [ , implementedprocedure ... ]

每個 implementedprocedure 都有下列語法和元件:

interface.definedname

- interface -必填。 這個程式包含類別或結構的介面名稱。
- Definedname -必填。 程式在 中 interface定義的名稱。 這不一定與 name相同,這個程式用來實作已定義程序的名稱。
Custom 必須的。 宣告為 Custom 的事件必須定義自定義 AddHandlerRemoveHandlerRaiseEvent 存取子。
delegatename 選擇性。 指定事件處理程式簽章的委派名稱。
AddHandler 必須的。 AddHandler宣告 存取子,這個存取子會指定要在加入事件處理程式時執行的語句,方法是使用 語句明確AddHandler或隱含地使用 Handles 子句。
End AddHandler 必須的。 終止 區塊 AddHandler
value 必須的。 參數名稱。
RemoveHandler 必須的。 RemoveHandler宣告 存取子,指定使用 RemoveHandler 語句移除事件處理程式時要執行的語句。
End RemoveHandler 必須的。 終止 區塊 RemoveHandler
RaiseEvent 必須的。 RaiseEvent宣告 存取子,指定使用 RaiseEvent 語句引發事件時要執行的語句。 一般而言,這會叫用 和 RemoveHandler 存取子所AddHandler維護的委派清單。
End RaiseEvent 必須的。 終止 區塊 RaiseEvent
delegatesignature 必須的。 符合委派所需 delegatename 參數的參數清單。 您必須以括弧括住 參數清單
statements 選擇性。 包含、 RemoveHandlerRaiseEvent 方法主體的AddHandler語句。
End Event 必須的。 終止 區塊 Event

備註

宣告事件之後,請使用 RaiseEvent 語句來引發 事件。 一般事件可能會宣告並引發,如下列片段所示:

Public Class EventSource
    ' Declare an event.
    Public Event LogonCompleted(ByVal UserName As String)
    Sub CauseEvent()
        ' Raise an event on successful logon.
        RaiseEvent LogonCompleted("AustinSteele")
    End Sub
End Class

備註

您可以宣告事件自變數,就像您執行程式的自變數一樣,但有下列例外狀況:事件不能有具名自變數、 ParamArray 自變數或 Optional 自變數。 事件沒有傳回值。

若要處理事件,您必須使用 HandlesAddHandler 語句,將它與事件處理程式子程式產生關聯。 子程式與事件的簽章必須相符。 若要處理共用事件,您必須使用 AddHandler 語句。

您只能在模組層級使用 Event 。 這表示事件的 宣告內容 必須是類別、結構、模組或介面,而且不能是來源檔案、命名空間、程式或區塊。 如需詳細資訊,請參閱 宣告內容和預設存取層級

在大部分情況下,您可以使用本主題的語法一節中的第一個語法來宣告事件。 不過,某些案例需要您更充分掌控事件的詳細行為。 本主題的 Syntax 區段中的最後一個語法會使用 Custom 關鍵詞,可讓您定義自定義事件,以提供該控件。 在自訂事件中,您可以指定程式代碼在事件中加入或移除事件處理程式,或程式代碼引發事件時所發生的確切情況。 如需範例,請參閱 如何:宣告自定義事件以節省記憶體如何:宣告自定義事件以避免封鎖

範例

下列範例會使用事件來計算從 10 到 0 的秒數。 此程式代碼說明數個事件相關方法、屬性和語句。 這包括 RaiseEvent 語句。

引發事件的類別是事件來源,而處理事件的方法則是事件處理程式。 事件來源可以有多個其產生的事件處理程式。 當 類別引發事件時,該事件會在已選取處理該物件實例之事件的每個類別上引發。

此範例也會使用表單 (Form1) 搭配按鈕 (Button1) 和文字框 (TextBox1)。 當您按鍵時,第一個文字框會顯示從10到0秒的倒數。 當完整時間 (10 秒) 經過時,第一個文本框會顯示 「Done」。。

的程式代碼 Form1 會指定表單的初始和終端機狀態。 它也包含引發事件時所執行的程序代碼。

若要使用此範例,請開啟新的 Windows Forms 專案。 然後,將名為 Button1 的按鈕和名為 TextBox1 的文字框新增至名為 的主要表單,名為 Form1。 然後以滑鼠右鍵按兩下表單,然後按兩下 [ 檢視程式代碼 ] 以開啟程式代碼編輯器。

WithEvents將變數新增至 類別的Form1宣告區段:

Public Class TimerExample
    Private WithEvents mTimer As TimerState

將下列程式代碼新增至的程序 Form1代碼。 取代可能存在的任何重複程式,例如 Form_LoadButton_Click

    Public Sub StartCountdownExample()
        mTimer = New TimerState()
        mTimer.StartCountdown(10.0, 1.0)
    End Sub

    Private Sub mTimer_UpdateTime(ByVal Countdown As Double) Handles mTimer.UpdateTime
        Console.WriteLine("Time remaining: " & Format(Countdown, "##0.0") & " seconds")
    End Sub

    Private Sub mTimer_Finished() Handles mTimer.Finished
        Console.WriteLine("Done")
    End Sub
End Class

Public Class TimerState
    Public Event UpdateTime(ByVal Countdown As Double)
    Public Event Finished()
    Public Sub StartCountdown(ByVal Duration As Double,
                              ByVal Increment As Double)
        Dim SoFar As Double = 0
        Do While SoFar < Duration
            System.Threading.Thread.Sleep(CInt(Increment * 1000))
            SoFar += Increment
            RaiseEvent UpdateTime(Duration - SoFar)
        Loop
        RaiseEvent Finished()
    End Sub
End Class

按 F5 執行上一個範例,然後按下標示為 [開始] 的按鈕。 第一個文本框會開始倒數秒。 當完整時間 (10 秒) 經過時,第一個文本框會顯示 「Done」。。

備註

My.Application.DoEvents方法不會以與表單相同的方式處理事件。 若要讓表單直接處理事件,您可以使用多線程。 如需詳細資訊,請參閱 Managed Threading

另請參閱