次の方法で共有


AddHandler ステートメント

実行時にイベントをイベント ハンドラーに関連付けます。

構文

AddHandler event, {AddressOf eventhandler | expression }

部品

部分 説明
event 処理するイベントの名前。
eventhandler イベントを処理するプロシージャの名前。
expression イベントを処理するラムダ式。

パーツ AddressOf eventhandlerexpression は相互に排他的です。

注釈

AddHandlerおよびRemoveHandlerステートメントを使用すると、プログラムの実行中にいつでもイベント処理を開始および停止できます。

新しいイベント ハンドラー ( eventhandler プロシージャまたは expression ラムダ) のシグネチャは、イベント eventのシグネチャと一致する必要があります。

Handles キーワードと AddHandler ステートメントを使用すると、特定のプロシージャが特定のイベントを処理するように指定できますが、違いがあります。 AddHandler ステートメントは、実行時にプロシージャをイベントに接続します。 プロシージャを定義する場合は、 Handles キーワードを使用して、特定のイベントを処理するように指定します。 詳細については、「 ハンドル」を参照してください。

明示的なラムダを使用して追加されたハンドラーは、後で ( RemoveHandlerを使用して) 削除できません。 実際、ラムダに名前が指定されていない場合、後でそれを参照することはできません。 ただし、ラムダを変数に割り当て、この変数を使用してハンドラーを追加すると、この変数を使用してハンドラーを削除できます。

カスタム イベントの場合、 AddHandler ステートメントはイベントの AddHandler アクセサーを呼び出します。 カスタム イベントの詳細については、「 イベント ステートメント」を参照してください。

次の例では、データ バインディングシナリオでConvertEventHandlerデリゲートでAddHandlerを使用する方法を示します。 この例では、10 進値と通貨文字列の間で変換するために、Binding オブジェクトのFormatイベントとParseイベントにイベント ハンドラーをアタッチする実際のユース ケースを示します。

Public Class DataBindingExample
    Private textBox1 As TextBox
    Private ds As DataSet
    
    Public Sub New()
        textBox1 = New TextBox()
        ds = New DataSet()
        SetupSampleData()
        BindControlWithAddHandler()
    End Sub
    
    Private Sub SetupSampleData()
        Dim table As New DataTable("Orders")
        table.Columns.Add("OrderAmount", GetType(Decimal))
        table.Rows.Add(123.45D)
        table.Rows.Add(67.89D)
        ds.Tables.Add(table)
    End Sub
    
    Private Sub BindControlWithAddHandler()
        Dim binding As New Binding("Text", ds, "Orders.OrderAmount")
        
        ' Use AddHandler to associate ConvertEventHandler delegates
        AddHandler binding.Format, AddressOf DecimalToCurrency
        AddHandler binding.Parse, AddressOf CurrencyToDecimal
        
        textBox1.DataBindings.Add(binding)
    End Sub
    
    Private Sub DecimalToCurrency(ByVal sender As Object, ByVal e As ConvertEventArgs)
        If e.DesiredType IsNot GetType(String) Then
            Return
        End If
        e.Value = CDec(e.Value).ToString("c")
    End Sub
    
    Private Sub CurrencyToDecimal(ByVal sender As Object, ByVal e As ConvertEventArgs)
        If e.DesiredType IsNot GetType(Decimal) Then
            Return
        End If
        e.Value = Convert.ToDecimal(e.Value.ToString())
    End Sub
End Class

' Simple example for basic AddHandler usage
Sub TestBasicEvents()
    Dim Obj As New Class1
    AddHandler Obj.Ev_Event, AddressOf EventHandler
    Obj.CauseSomeEvent()
    RemoveHandler Obj.Ev_Event, AddressOf EventHandler
    Obj.CauseSomeEvent()
    
    ' Lambda expression example
    AddHandler Obj.Ev_Event, Sub ()
        MsgBox("Lambda caught event.")
    End Sub
    Obj.CauseSomeEvent()
End Sub

Sub EventHandler()
    MsgBox("EventHandler caught event.")
End Sub

Public Class Class1
    Public Event Ev_Event()
    Sub CauseSomeEvent()
        RaiseEvent Ev_Event()
    End Sub
End Class

この例は、次を示しています。

  • データ バインディング用の Binding オブジェクトの作成。
  • AddHandlerを使用してConvertEventHandlerデリゲートをFormatおよびParseイベントにアタッチする。
  • 10 進数と通貨の文字列形式を変換するイベント ハンドラー メソッドを実装します。
  • カスタム イベントとラムダ式を使用した基本的な AddHandler の使用方法。

こちらも参照ください