フォーム上のコントロールへのイベント処理を宣言する場合には、 以下の図の様に各コントロールを選択し、右側のイベントの中から選択すると、 対応するイベントの処理関数の宣言が自動で生成を行ってくれます。
通常はこの方法で良いのですが、多くのコントロールに設定するには手間ですし、 同じ様な処理の場合には、処理関数を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
関連する記事
⇒フォーム上のコントロールで[Enter]キー押下で次のコントロールにフォーカス移動する⇒コントロールの同じイベント処理に複数の関連付けをテスト:[AddHandler,DirectCast]
⇒コントロールを配列で処理する方法 :[AddHandler,DirectCast]
PR
コメント