【入門編】KeyPressとKeyDownイベントを制する:テキストボックスでのEnterキーによるフォーカス移動とバリデーション制御の実務テクニック – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

Enterキーで業務を加速させる!VB.NETのイベント制御を極める「極意」

こんにちは。現場で叩き上げられたエンジニアなら一度は直面する「Enterキーの壁」。
「Enterを押したら次の欄へ飛んでほしい」「数値しか打てないようにしたい」。これらは業務アプリのユーザビリティを左右する生命線です。

今回は、VBAから脱却し、VB.NETという「オブジェクト指向の海」へ漕ぎ出したあなたへ、KeyPressとKeyDownを使いこなすための知見を授けます。ここさえ押さえれば、あなたの作るUIは一気にプロ仕様に昇華します。

1. イベントの「役割分担」を知る

VB.NETのイベントには、発生する順番と役割があります。ここを混同していると、バグの温床になります。

  • KeyDownイベント: キーが「押された瞬間」に発生。キーコード(EnterやTabなど)を判定するのに適しています。
  • KeyPressイベント: 文字が「入力確定した瞬間」に発生。文字コード(A, B, 1, 2など)を判定し、入力を拒否する(キャンセルする)のに適しています。

極意:「キーの制御(移動など)」はKeyDown、「文字の選別(数値限定など)」はKeyPressで行うのが鉄則です。

2. Enterでフォーカスを次へ送る(KeyDownの活用)

Enterキーを押すと「ピッ」と警告音が鳴る……あの忌々しい挙動を止め、スマートに次の項目へ移動させましょう。

Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown
‘ Enterキーが押されたか判定
If e.KeyCode = Keys.Enter Then
‘ 警告音(ビープ音)を抑制
e.SuppressKeyPress = True

‘ 次のコントロールへフォーカスを移動
‘ SelectNextControl(開始点, 前方移動か, 子コントロールまで探すか, タブ順か, 警告音オフか)
Me.SelectNextControl(Me.ActiveControl, True, True, True, True)
End If
End Sub

ここがポイント:
`e.SuppressKeyPress = True` を忘れないでください。これを書かないと、フォーカス移動後に「ピッ」という音が鳴り響き、現場のユーザーから「うるさい」と苦情が来ます。

3. 数値のみ入力を許可する(KeyPressの活用)

「全角数字が入って計算エラーになる」なんて事態は、開発者が未然に防ぐべきです。KeyPressイベントで文字を門前払いしましょう。

Private Sub TextBox2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox2.KeyPress
‘ 入力された文字が「数字」または「BackSpace(削除)」以外なら入力を無効化
If Not (Char.IsDigit(e.KeyChar) OrElse Char.IsControl(e.KeyChar)) Then
e.Handled = True
End If
End Sub

解説:

  • `Char.IsDigit`: 数字かどうかを判定する神メソッド。
  • `Char.IsControl`: BackSpaceなどの制御キーを許可するために必要。これがないと、打ち間違えた時に消せなくなります。
  • `e.Handled = True`: 「私が処理しました(=このキー入力はなかったことにします)」という宣言です。

4. 陥りやすい罠:フォーカス移動の「落とし穴」

初学者がよくやるミスは、バリデーション(入力値チェック)とフォーカス移動の順序を間違えることです。

フォーカスが移動した後に「入力エラーです」とメッセージを出しても、ユーザーは「どこが間違っているの?」とパニックになります。

推奨されるフロー:

1. Validatingイベントを使う:フォーカスが外れる瞬間にチェックを行う。
2. ErrorProviderコンポーネントを使う:視覚的に「ここがダメだよ」と教える。

‘ 項目が空ならエラーアイコンを出す
Private Sub TextBox1_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
If String.IsNullOrWhiteSpace(TextBox1.Text) Then
ErrorProvider1.SetError(TextBox1, “必須項目です!”)
Else
ErrorProvider1.SetError(TextBox1, “”)
End If
End Sub

先輩からのアドバイス:UI設計は「優しさ」です

プログラムを書くとき、つい「どう動かすか」に意識が向きがちですが、本当に大事なのは「ユーザーがいかにストレスなくデータを入力できるか」です。

  • Enterでの移動は、ユーザーの右手の動きを最小限にする。
  • 数値制限は、ユーザーの修正コストをゼロにする。

これらを組み込むだけで、あなたのVB.NETアプリケーションは「ただのツール」から「業務を支える相棒」に変わります。

最初は難しく感じるかもしれませんが、イベントの泡立ち(バブリング)と制御のタイミングさえ掴めば、怖いものはありません。一つひとつ、着実に自分のスキルにしていってくださいね。応援しています!

タイトルとURLをコピーしました