フォーム上のコントロールへのイベント処理を宣言する場合には、 以下の図の様に各コントロールを選択し、右側のイベントの中から選択すると、 対応するイベントの処理関数の宣言が自動で生成を行ってくれます。
通常はこの方法で良いのですが、多くのコントロールに設定するには手間ですし、 同じ様な処理の場合には、処理関数を1個作成しそれを各コントロールに設定したいものです。
そこで AddHandler メソッドを使うことになります。
MSDNの説明によれば以下の様になっています。
AddHandler ステートメントについて
AddHandler event, AddressOf eventhandler 指定項目 event 処理するイベントの名前。 eventhandler イベントを処理するプロシージャの名前。 解説 AddHandler ステートメントと RemoveHandler ステートメントを使うと、 プログラムの実行中にいつでもイベント処理を開始および停止できます。 eventhandlerプロシージャのシグネチャは、eventイベントのシグネチャと一致する必要があります。
今回の例としては、フォーム上に3個の TextBox を貼り付けています。
[Enter]キーを押下することで3個の TextBox のフォーカスが移動します。 更に、フォーカスが渡った TextBox の文字列が反転表示されます。
フォーム上のコントロールのイベント処理の関連付け
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | Public Class frmAddHandler ''' <summary> ''' フォームロードイベント ''' </summary> Private Sub frmAddHandler_Load(sender As Object , e As EventArgs) Handles Me .Load 'コントロールへのイベントハンドラ関連付け Call Me .SetEvent( Me .Controls) 'フォームがすべてのキー イベントを受け取る Me .KeyPreview = True End Sub ''' <summary> ''' コントロールへのイベントハンドラ関連付け ''' </summary> '''コントロールコレクション</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 ''' <summary> ''' コントロールのEnterイベント処理 ''' </summary> 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 ''' <summary> ''' コントロールのTextChangedイベント処理 ''' </summary> 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 ''' <summary> ''' フォームKeyDownイベント ''' </summary> 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 ''' <summary> ''' フォームKeyPressイベント ''' </summary> 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 |
関連する記事
⇒フォーム上のコントロールで[Enter]キー押下で次のコントロールにフォーカス移動する⇒コントロールの同じイベント処理に複数の関連付けをテスト:[AddHandler,DirectCast]
⇒コントロールを配列で処理する方法 :[AddHandler,DirectCast]
コメント