入力フォームで TextBox 等のフォーカス移動を[Enter]キー押下で行いたいという要望は結構あります。 汎用機などでは昔から[Enter]キー押下で入力域を移動できたため残ってきた入力方式です。 この方法をVB.NETで実現するには、各入力コントロールで[Enter]キー押下を判定して次のコントロールに フォーカスを移動すればいいのですが、各コントロールに制御をプログラムするのは手間です。 そのため、フォームで[Enter]キーの押下を検知して、そこで一括に制御すれば簡単に行えます。
フォームの KeyPreview プロパティを True に設定し、 フォームKeyDownイベントで SelectNextControl メソッドを使用しフォーカス移動をさせます。
SelectNextControl メソッドについて
Public Function SelectNextControl(ctl As System.Windows.Forms.Control , forward As Boolean , tabStopOnly As Boolean , nested As Boolean , wrap As Boolean) As Boolean 概要: 次のコントロールをアクティブにします。 パラメーター: ctl: 検索を開始する位置にある System.Windows.Forms.Control。 forward: タブ オーダー内を前方に移動する場合は true。 後方に移動する場合は false。 tabStopOnly: System.Windows.Forms.Control.TabStop プロパティが false に設定されている コントロールを無視する場合は true。それ以外の場合は false。 nested: 入れ子になった(子コントロールの子)子コントロールを含める場合は true。 それ以外の場合は false。 wrap: タブ オーダーの最後のコントロールに到達した後、 タブ オーダーの最初のコントロールから検索を続行する場合は true。 それ以外の場合は false。 戻り値: コントロールがアクティブにされた場合は true。それ以外の場合は false。
今回の例としては、フォーム上に3個の TextBox を貼り付けています。
[Enter]キーを押下することで3個の TextBox のフォーカスが移動します。
フォーム上のコントロールで[Enter]キー押下で次のコントロールにフォーカス移動する
Public Class frmEnterNext '''''' フォーム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 '''''' フォームロードイベント ''' Private Sub frmEnterNext_Load(sender As Object, e As EventArgs) Handles Me.Load 'フォームがすべてのキー イベントを受け取る Me.KeyPreview = True End Sub End Class
関連する記事
⇒フォーム上のコントロールのイベント処理の一括関連付け:[AddHandler,DirectCast]⇒コントロールの同じイベント処理に複数の関連付けをテスト:[AddHandler,DirectCast]
PR
コメント