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

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


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

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

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

AddHandler event, AddressOf eventhandler

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

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

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

01Public Class frmAddHandler
02 
03    ''' <summary>
04    ''' フォームロードイベント
05    ''' </summary>
06    Private Sub frmAddHandler_Load(sender As Object, e As EventArgs) Handles Me.Load
07        'コントロールへのイベントハンドラ関連付け
08        Call Me.SetEvent(Me.Controls)
09        'フォームがすべてのキー イベントを受け取る
10        Me.KeyPreview = True
11    End Sub
12 
13    ''' <summary>
14    ''' コントロールへのイベントハンドラ関連付け
15    ''' </summary>
16    ''' <param name="CtrlColl">コントロールコレクション</param>
17    Private Sub SetEvent(ByVal CtrlColl As Control.ControlCollection)
18        'コントロール変数
19        Dim objControl As Control
20        'テキストボックスコントロール変数
21        Dim objTextBox As TextBox
22 
23        'コントロールがある分だけループ
24        For Each objControl In CtrlColl
25            If TypeOf objControl Is TextBox Then
26                'テキストボックスコントロールに変換
27                objTextBox = DirectCast(objControl, TextBox)
28                'Enterイベントの関連付け
29                AddHandler objTextBox.Enter, AddressOf CtrlEnterEvent
30                'Changedイベントの関連付け
31                AddHandler objTextBox.TextChanged, AddressOf CtrlTextChangedEvent
32            Else
33            End If
34        Next
35    End Sub
36 
37    ''' <summary>
38    ''' コントロールのEnterイベント処理
39    ''' </summary>
40    Private Sub CtrlEnterEvent(ByVal sender As Object, ByVal e As System.EventArgs)
41        If TypeOf sender Is TextBox Then
42            'TextBoxのとき
43            DirectCast(sender, TextBox).SelectAll()
44        End If
45    End Sub
46 
47    ''' <summary>
48    ''' コントロールのTextChangedイベント処理
49    ''' </summary>
50    Private Sub CtrlTextChangedEvent(ByVal sender As Object, ByVal e As System.EventArgs)
51        If TypeOf sender Is TextBox Then
52            'TextBoxのとき
53            Dim objTextBox As TextBox = DirectCast(sender, TextBox)
54            '仮の処理として表示内容をTagに退避
55            objTextBox.Tag = objTextBox.Text
56        End If
57    End Sub
58 
59    ''' <summary>
60    ''' フォームKeyDownイベント
61    ''' </summary>
62    Private Sub frmEnterNext_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
63        If e.KeyCode = Keys.Enter Then
64            If e.Control = False Then
65                '[Enter]キーで次の TabIndex があるコントロールへフォーカスを移す
66                Me.SelectNextControl(Me.ActiveControl, Not e.Shift, True, True, True)
67            End If
68        End If
69    End Sub
70 
71    ''' <summary>
72    ''' フォームKeyPressイベント
73    ''' </summary>
74    Private Sub frmEnterNext_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
75        If e.KeyChar = ControlChars.Cr Then
76            '[Enter]キーで音が出るので、キーイベントが処理されたことにして音を消す
77            e.Handled = True
78        End If
79    End Sub
80 
81End Class
総アクセス数