VB.NET|Formで「Enter」キーでフォーカスを移動する

VB.NETのFORMは通常、「Tab」キーで次の「TabIndex」にフォーカスが移動する仕様となっています。

その理由は「Enter」キーには別の機能が備わっているからです。

「Enter」で「Tab」キーと同様にフォーカスを移動させることになると、「Enter」本来の機能を無効化することになります。

「Enter」本来の機能を無効化しても大きな問題は発生しないと思います。

事実、これまでに不満感じることはありませんでした。

「Enter」キーでフォーカスを移すコード

Formの「KeyDown」イベントに装備します。

Private Sub Form_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    If e.KeyCode = Keys.Enter Then
        If e.Control = False Then
            Me.SelectNextControl(Me.ActiveControl, Not e.Shift, True, True, True)
        End If
    End If
End Sub

「KeyPreview」プロパティの有効化

先ほどのコードを装備して、実行しても「Enter」キーでフォーカスが移動しません。

コードを実行するに先立って「KeyPreview」プロパティを「有効」にしないと正常に動作しないのです。

次のコードはFormの「Load」イベントで「KeyPreview」プロパティを「有効」にする例です。

Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.KeyPreview = True
End Sub

「KeyPreview」プロパティを「有効」にすることで「Enter」でフォーカスの移動できるようになりました。

ビープ音の停止

このままですと「Enter」キーを押す度にビープ音が鳴ってしまいます。

イベントを強制的に発生させているためなので、キーイベントが処理されたことにしてしまいます。

Formの「KeyPress」イベントに装備します。

Private Sub Form_KeyPress(sender As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress
    If e.KeyChar = ControlChars.Cr Then
        e.Handled = True
    End If
End Sub

実装後のキーボード操作

「Enter」で次のTabIndexを持つコントロールに移動します。

「Shift」+「Enter」前のTabIndexを持つコントロールに移動します。

MultiLineのテキストボックスでの改行は「Ctrl」+「Enter」で対応できます。

コメント