.Net(VB、C#)でEnterキーによるコントロール間のフォーカス移動

フォーム上の各コントロールにKeyDownイベント・ハンドラを追加し、そのイベント・ハンドラ内でEnterキーが押されたときの処理として、次の何れかのメソッドを実行させることにより実現できる。

※フォーム全体としてEnterキーを一括処理する方法は後述。

  • フォームのProcessTabKeyメソッド
  • フォームのSelectNextControlメソッド

ProcessTabKeyメソッドは、呼び出しが単純で簡単だが、オプションとして指定できる機能は移動方向のみとなる。

(Bool値のパラメータにより指定:前方向に移動する(True)/後方向に移動する(False))

SelectNextControlメソッドは移動方向に加え、かなり細かくフォーカス移動処理を制御できる。

例えば、TabStopプロパティがFalseに設定されているコントロールへの移動や、入れ子になったコントロールには移動させないといった制御が可能。

フォーカスの移動方向について、Enterキーのみ押された場合は前方向、Shift+Enterキーが押された場合は後方向とする場合、以下のようにフラグを設定することで対応可能。

 

フォーム全体としてEnterキーを一括処理する

コントロールごとにKeyDownイベント・ハンドラを追加して上記の処理を実装すれば、Enterキーによるフォーカス移動が可能となるが、コントロールを追加するたびに同様の処理を実装しなければならない。

フォームのKeyDownイベント・ハンドラでEnterキーの一括処理を行うことで、コントロールの追加で発生する作業が不要となる。

以下は、フォームのKeyDownイベント・ハンドラでEnterキーの一括処理を行うサンプル。

※フォームのKeyPreviewプロパティをTrueに設定しておく

 

Enterキーによるフォーカス移動をスキップする

複数行の入力が可能なTextBoxコントロールにおいて、Enterキーで改行処理が行われるので、Enterキーによるフォーカス移動はさせたくない等の理由でフォーカス移動をキャンセルするには、対象コントロールをそのクラスの種類(型)により判別し、フォーカス移動の処理から除外する。

コントロールの種類(型)を判別するには、TypeOf…Is式(VB.NET)/is演算子(C#)を利用する。

キー処理中のコントロール(=アクティブなコントロール)がTextBoxコントロールであるかを判別し、それがTextBoxコントロールの場合には、そのMultiLineプロパティがTrueかどうか(TextBoxコントロールが複数行対応であるかどうか)を確認する。

MultiLineプロパティがTrueの場合にはEnterキーによるフォーカス移動を行わない。

以下、サンプル。

 

おすすめ

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください