【入門編】Windows Formsにおけるフォーカス消失時の自動バリデーション:ValidatingとValidatedイベントの正しい設計順序 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

こんにちは。現場で「動けばいい」というコードから脱却し、誰からも愛される堅牢なアプリケーションを目指すあなたへ。

今日は、Windows Forms開発において避けては通れない、そして多くの初学者が沼にハマる「フォーカス制御とバリデーション」の極意を伝授します。

マクロの記録から一歩踏み出し、プロの設計者としての一歩を踏み出しましょう。

—

1. なぜ「Validating」と「Validated」なのか?

Windows Formsには、入力欄(TextBoxなど)からフォーカスが外れる際、自動的に発火する2つの重要なイベントがあります。

  • Validatingイベント: 入力値が「正しいか」を判定する場所。
  • Validatedイベント: 検証が終わった「後」の処理を行う場所。

多くの初心者は、これらを混同して「入力チェックの結果、エラーならフォーカスを戻す」という処理を力技で実装しようとして失敗します。Validatingイベントには、フォーカスを制御するための特別な力が備わっていることを知るのが、マスターへの近道です。

—

2. 「迷子にさせない」スマートなバリデーションの実装

ユーザーが入力不備のまま次の項目へ行こうとしたとき、それを阻止し、元の場所に引き止めるには `CancelEventArgs` の `Cancel` プロパティを使います。

以下のコードは、TextBoxに入力された値が「数値のみ」であることを検証し、不正であればフォーカスを固定する実践的なパターンです。

.net
‘ TextBox1_Validating イベントハンドラ
Private Sub TextBox1_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
Dim input As String = TextBox1.Text.Trim()

‘ 例:空欄または数値以外はNGとするチェック
If String.IsNullOrEmpty(input) OrElse Not IsNumeric(input) Then
‘ 1. ユーザーにエラーを通知
MessageBox.Show(“数値以外の値が入力されています。”, “入力エラー”, MessageBoxButtons.OK, MessageBoxIcon.Warning)

‘ 2. ここが重要!CancelをTrueにすると、フォーカス移動がキャンセルされる
e.Cancel = True

‘ 3. エラーになったテキストを強調表示するなどのUIケア
TextBox1.SelectAll()
End If
End Sub

このコードのポイント

  • `e.Cancel = True`: これが魔法の呪文です。OSレベルでフォーカス遷移を遮断します。
  • `SelectAll()`: ユーザー体験(UX)への配慮です。エラー箇所を全選択させることで、ユーザーは即座に修正モードに入れます。

—

3. よくある失敗:無限ループの罠

初心者が一番やってしまうのが、Validatingイベント内で `Focus()` メソッドを呼び出してしまうことです。

`Focus()` を呼ぶと、またValidatingイベントが走り……という無限ループに陥り、アプリケーションがフリーズします。「フォーカスを戻すときは `Focus()` を使うな、`e.Cancel = True` を使え」。これは現場の鉄則です。

—

4. Validatedイベントの正しい使いどころ

では、`Validated` はいつ使うのでしょうか?
それは「検証が成功した後に、値を確定させる処理」です。

  • 検証が終わった後に計算結果を表示する
  • サーバーへデータを送信する準備をする
  • 別のコントロールの有効/無効を切り替える

`Validating` でチェックし、`Validated` で実行する。この「役割の分離」が、バグの少ないクリーンな設計を生みます。

.net
‘ Validated イベントハンドラ
Private Sub TextBox1_Validated(sender As Object, e As EventArgs) Handles TextBox1.Validated
‘ ここには検証ロジックは書かない。
‘ すでに値が正しいことが保証されている状態で、次の処理を実行する。
UpdateTotalBalance() ‘ 例:合計金額を再計算するメソッド
End Sub

—

5. まとめ:プロの視点を持つために

今回のポイントを整理します。

1. 入力チェックは `Validating` で行う。
2. フォーカスを維持したいなら `e.Cancel = True` を使う(`Focus()` は使わない)。
3. 検証後の処理は `Validated` に任せる。

この設計パターンを身につけるだけで、あなたの書くアプリケーションの「品質」は劇的に向上します。ユーザーが意図しない操作をしても壊れない、迷わせない。そんな優しいソフトウェアを一緒に作っていきましょう。

ここをクリアしたあなたは、もう初心者ではありません。自信を持って次のステップへ進んでください。応援しています!

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