VB.NET Tips - フォーム上のコントロールのイベント処理の関連付け

フォーム上のコントロールへのイベント処理を宣言する場合には、 以下の図の様に各コントロールを選択し、右側のイベントの中から選択すると、 対応するイベントの処理関数の宣言が自動で生成を行ってくれます。


通常はこの方法で良いのですが、多くのコントロールに設定するには手間ですし、 同じ様な処理の場合には、処理関数を1個作成しそれを各コントロールに設定したいものです。

そこで AddHandler メソッドを使うことになります。
MSDNの説明によれば以下の様になっています。

AddHandler ステートメントについて

AddHandler event, AddressOf eventhandler

指定項目
    event           処理するイベントの名前。
    eventhandler    イベントを処理するプロシージャの名前。
解説
    AddHandler ステートメントと RemoveHandler ステートメントを使うと、
    プログラムの実行中にいつでもイベント処理を開始および停止できます。
    eventhandlerプロシージャのシグネチャは、eventイベントのシグネチャと一致する必要があります。

今回の例としては、フォーム上に3個の TextBox を貼り付けています。
[Enter]キーを押下することで3個の TextBox のフォーカスが移動します。 更に、フォーカスが渡った TextBox の文字列が反転表示されます。

フォーム上のコントロールのイベント処理の関連付け

Public Class frmAddHandler

    ''' 
    ''' フォームロードイベント
    ''' 
    Private Sub frmAddHandler_Load(sender As Object, e As EventArgs) Handles Me.Load
        'コントロールへのイベントハンドラ関連付け
        Call Me.SetEvent(Me.Controls)
        'フォームがすべてのキー イベントを受け取る
        Me.KeyPreview = True
    End Sub

    ''' 
    ''' コントロールへのイベントハンドラ関連付け
    ''' 
    ''' コントロールコレクション</param>
    Private Sub SetEvent(ByVal CtrlColl As Control.ControlCollection)
        'コントロール変数
        Dim objControl As Control
        'テキストボックスコントロール変数
        Dim objTextBox As TextBox

        'コントロールがある分だけループ
        For Each objControl In CtrlColl
            If TypeOf objControl Is TextBox Then
                'テキストボックスコントロールに変換
                objTextBox = DirectCast(objControl, TextBox)
                'Enterイベントの関連付け
                AddHandler objTextBox.Enter, AddressOf CtrlEnterEvent
                'Changedイベントの関連付け
                AddHandler objTextBox.TextChanged, AddressOf CtrlTextChangedEvent
            Else
            End If
        Next
    End Sub

    ''' 
    ''' コントロールのEnterイベント処理
    ''' 
    Private Sub CtrlEnterEvent(ByVal sender As Object, ByVal e As System.EventArgs)
        If TypeOf sender Is TextBox Then
            'TextBoxのとき
            DirectCast(sender, TextBox).SelectAll()
        End If
    End Sub

    ''' 
    ''' コントロールのTextChangedイベント処理
    ''' 
    Private Sub CtrlTextChangedEvent(ByVal sender As Object, ByVal e As System.EventArgs)
        If TypeOf sender Is TextBox Then
            'TextBoxのとき
            Dim objTextBox As TextBox = DirectCast(sender, TextBox)
            '仮の処理として表示内容をTagに退避
            objTextBox.Tag = objTextBox.Text
        End If
    End Sub

    ''' 
    ''' フォームKeyDownイベント
    ''' 
    Private Sub frmEnterNext_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        If e.KeyCode = Keys.Enter Then
            If e.Control = False Then
                '[Enter]キーで次の TabIndex があるコントロールへフォーカスを移す
                Me.SelectNextControl(Me.ActiveControl, Not e.Shift, True, True, True)
            End If
        End If
    End Sub

    ''' 
    ''' フォームKeyPressイベント
    ''' 
    Private Sub frmEnterNext_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
        If e.KeyChar = ControlChars.Cr Then
            '[Enter]キーで音が出るので、キーイベントが処理されたことにして音を消す
            e.Handled = True
        End If
    End Sub

End Class