6

この投稿を読んでください。この投稿で説明したのと同じ問題がありますが、C# ではなく VB.net でやろうとしています。

カスタムイベントを使用する必要があります。(私はコード変換サイトを使用して、カスタム イベントについて学習しました。) したがって、IDE で次のように入力すると、次のようになります。

Public Custom Event AddRemoveAttendees As EventHandler

次のコード スニペットに展開されます。

Public Custom Event AddRemoveAttendees As EventHandler
    AddHandler(ByVal value As EventHandler)

    End AddHandler

    RemoveHandler(ByVal value As EventHandler)

    End RemoveHandler

    RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)

    End RaiseEvent
End Event

しかし、私はそれをどうするかわかりません。今日まで、カスタム イベントについて聞いたことがありませんでした。

私が望むのは、ボタンのクリックイベントをユーザーコントロールのコンテナまでバブルアップさせることです。独自のイベントをラップできることはわかっていますが、その道を進む前に、少なくともカスタム イベントを理解したいと考えています。

セス

4

2 に答える 2

8

カスタム イベントを使用して別のコントロールのイベントをバブリングするには、次のようにします。

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

そしてAddHandlerRemoveHandler指定されたイベント ハンドラーをコントロールのイベントにアタッチまたは削除する呼び出しを伝達するだけです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

そのような詳細な制御が必要ない場合は、カスタム イベントを宣言する必要はないと思います。

于 2009-07-03T21:26:43.097 に答える
6

あなたが言及した他の投稿と同じものが必要な場合は、VB.NET の同等物を次に示します。

Public Custom Event AddRemoveAttendees As EventHandler

    AddHandler(ByVal value As EventHandler)
        AddHandler SaveButton.Click, value
    End AddHandler

    RemoveHandler(ByVal value As EventHandler)
        RemoveHandler SaveButton.Click, value
    End RemoveHandler

End Event

しかし、それは良い考えではないと思います。なぜなら、senderイベントのパラメーターはButtonあなたではなく になるからUserControlです ...

代わりに、Button.Click イベントをサブスクライブして、独自のイベントを発生させることができます (明示的なアクセサーなし)。

于 2009-07-03T21:36:22.517 に答える