VB.NET Tips - フォーム上のコントロールで[Enter]キー押下で次のコントロールにフォーカス移動する

入力フォームで 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]キー押下で次のコントロールにフォーカス移動する

01Public Class frmEnterNext
02 
03    ''' <summary>
04    ''' フォームKeyDownイベント
05    ''' </summary>
06    Private Sub frmEnterNext_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
07        If e.KeyCode = Keys.Enter Then
08            If e.Control = False Then
09                '[Enter]キーで次の TabIndex があるコントロールへフォーカスを移す
10                Me.SelectNextControl(Me.ActiveControl, Not e.Shift, True, True, True)
11            End If
12        End If
13    End Sub
14 
15    ''' <summary>
16    ''' フォームKeyPressイベント
17    ''' </summary>
18    Private Sub frmEnterNext_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
19        If e.KeyChar = ControlChars.Cr Then
20            '[Enter]キーで音が出るので、キーイベントが処理されたことにして音を消す
21            e.Handled = True
22        End If
23    End Sub
24 
25    ''' <summary>
26    ''' フォームロードイベント
27    ''' </summary>
28    Private Sub frmEnterNext_Load(sender As Object, e As EventArgs) Handles Me.Load
29        'フォームがすべてのキー イベントを受け取る
30        Me.KeyPreview = True
31    End Sub
32 
33End Class
総アクセス数