カスタム イベントを使用して別のコントロールのイベントをバブリングするには、次のようにします。
Public Custom Event AddRemoveAttendees As EventHandler
AddHandler(ByVal value As EventHandler)
AddHandler _theButton.Click, value
End AddHandler
RemoveHandler(ByVal value As EventHandler)
RemoveHandler _theButton.Click, value
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
' no need to do anything in here since you will actually '
' not raise this event; it only acts as a "placeholder" for the '
' buttons click event '
End RaiseEvent
End Event
そしてAddHandler
、RemoveHandler
指定されたイベント ハンドラーをコントロールのイベントにアタッチまたは削除する呼び出しを伝達するだけですClick
。
カスタム イベントの使用を少し拡張するために、カスタム イベントの別の実装例を次に示します。
Dim _handlers As New List(Of EventHandler)
Public Custom Event AddRemoveAttendees As EventHandler
AddHandler(ByVal value As EventHandler)
_handlers.Add(value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
If _handlers.Contains(value) Then
_handlers.Remove(value)
End If
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
For Each handler As EventHandler In _handlers
Try
handler.Invoke(sender, e)
Catch ex As Exception
Debug.WriteLine("Exception while invoking event handler: " & ex.ToString())
End Try
Next
End RaiseEvent
End Event
上記のように、通常のイベント宣言以外にはほとんど何もしません。
Public Event AddRemoveAttendees As EventHandler
これは、イベント ハンドラーのアタッチと削除、およびイベントの発生を可能にする同様のメカニズムを提供します。カスタム イベントによって追加されるのは、追加レベルの制御です。イベントの追加、削除、および発生に関するコードを記述して、ルールを強制し、何が起こるかを少し調整できます。たとえば、イベントに関連付けるイベント ハンドラーの数を制限したい場合があります。これを実現するにはAddHandler
、上記のサンプルのセクションを次のように変更します。
AddHandler(ByVal value As EventHandler)
If _handlers.Count < 8 Then
_handlers.Add(value)
End If
End AddHandler
そのような詳細な制御が必要ない場合は、カスタム イベントを宣言する必要はないと思います。