ユーザー入力を検証する方法の概要 (Windows フォーム .NET)

ユーザーがアプリケーションにデータを入力するときに、アプリケーションで使用される前にデータが有効であるかどうかを検証することが必要な場合があります。 特定のテキスト フィールドの長さがゼロでないこと、フィールドが電話番号として書式設定されていること、または文字列に無効な文字が含まれていないことを要求する場合などです。 Windows フォームには、アプリケーションの入力を検証するための方法がいくつか用意されています。

MaskedTextBox コントロール

電話番号や部品番号など、適切に定義された形式でデータを入力するようにユーザーに要求する必要がある場合は、MaskedTextBox コントロールを使用して最小限のコードで、これをすばやく完了することができます。 "マスク" は、マスク言語の文字で構成される文字列であり、テキスト ボックスの任意の位置に入力できる文字を指定します。 このコントロールにより、一連のプロンプトがユーザーに表示されます。 ユーザーが不正なエントリを入力した場合、たとえば、数字が必要なときにユーザーが文字を入力した場合、このコントロールにより、入力が自動的に拒否されます。

MaskedTextBox で使用されるマスク言語は柔軟性があります。 必須の文字、省略可能な文字、リテラル文字 (ハイフンやかっこなど)、通貨記号、日付の区切り記号を指定できます。 このコントロールは、データ ソースにバインドされている場合にも問題なく機能します。 データ バインディングのFormat イベントを使用して、マスクに準拠するように受信データを再フォーマットできます。また、Parse イベントを使用して、データ フィールドの仕様に準拠するように送信データを再フォーマットできます。

イベント ドリブン検証

検証をプログラムで完全に制御する場合、または複雑な検証チェックが必要な場合、Windows フォームに組み込まれた検証イベントを使用する必要があります。 自由形式のユーザー入力を受け入れる各コントロールには、コントロールがデータ検証を必要とするたびに Validating イベントが含まれます。 Validating イベント処理メソッドでは、いくつかの方法でユーザー入力を検証できます。 たとえば、郵便番号が含まれている必要のあるテキスト ボックスがある場合、次の方法で検証を実行できます。

  • 郵便番号が特定の郵便番号グループに属している必要がある場合、入力に対して文字列比較を実行し、ユーザーが入力したデータを検証することができます。 たとえば、郵便番号が {10001, 10002, 10003} のセットに含まれている必要がある場合、文字列比較を使用してデータを検証できます。

  • 郵便番号が特定の形式である必要がある場合、正規表現を使用して、ユーザーが入力したデータを検証できます。 たとえば、フォーム ##### または #####-#### を検証するには、正規表現 ^(\d{5})(-\d{4})?$ を使用できます。 フォーム A#A #A# を検証するには、正規表現 [A-Z]\d[A-Z] \d[A-Z]\d を使用できます。 正規表現の詳細については、「.NET 正規表現」および正規表現の例に関する記事を参照してください。

  • 郵便番号が有効な米国郵便番号である必要がある場合、郵便番号 Web サービスを呼び出して、ユーザーが入力したデータを検証できます。

Validating イベントには、型 CancelEventArgs のオブジェクトが提供されます。 コントロールのデータが有効ではないと判断した場合、このオブジェクトの Cancel プロパティを true に設定することによって、Validating イベントをキャンセルします。 Cancel プロパティを設定しない場合、Windows フォームによって、そのコントロールに対する検証が成功したと見なされ、Validated イベントが発生します。

TextBox でメール アドレスを検証するコード例については、Validating イベントのリファレンスを参照してください。

イベントドリブン検証のデータ バインド コントロール

検証は、データベース テーブルなどのデータソースにコントロールをバインドした場合に役立ちます。 検証を使用すると、コントロールのデータがデータソースに必要な形式を満たしていること、および引用符やバックスラッシュなどの安全ではないおそれがある特殊文字が含まれていないことを確認できます。

データ バインディングを使用する場合、コントロール内のデータは、Validating イベントの実行時にデータ ソースと同期されます。 Validating イベントをキャンセルした場合、データはデータ ソースと同期されません。

重要

Validating イベントの後に実行されるカスタム検証がある場合、データ バインディングには影響しません。 たとえば、Validated イベントに、データ バインディングをキャンセルしようとするコードが含まれている場合でも、データ バインディングは発生します。 この場合、Validated イベントで検証を実行するには、コントロールの Binding.DataSourceUpdateMode プロパティを DataSourceUpdateMode.OnValidation から DataSourceUpdateMode.Never に変更し、your-control.DataBindings["field-name"].WriteValue() を検証コードに追加します。

暗黙的および明示的な検証

では、コントロールのデータが検証されるのはいつでしょうか? これは、開発者が決定します。 アプリケーションのニーズに応じて、暗黙的または明示的な検証を使用できます。

暗黙的な検証

暗黙的な検証アプローチにより、ユーザーがデータを入力すると検証が実行されます。 キーが押されたときにキーを読み取ることによって、またはより一般的にはユーザーが入力フォーカスをコントロールから離すたびに、データが検証されます。 このアプローチは、作業中にデータに関するフィードバックをユーザーにすぐに提供したい場合に役立ちます。

コントロールに暗黙的な検証を使用する場合、そのコントロールの AutoValidate プロパティを EnablePreventFocusChange または EnableAllowFocusChange に設定する必要があります。 Validating イベントをキャンセルした場合、コントロールの動作は、AutoValidate に割り当てた値によって決まります。 EnablePreventFocusChangeを割り当てた場合、イベントをキャンセルすると、Validated イベントは発生しません。 ユーザーがデータを有効な形式に変更するまで、入力フォーカスは引き続き現在のコントロール上にあります。 EnableAllowFocusChange を割り当てた場合、Validated イベントをキャンセルすると、このイベントは発生しませんが、フォーカスは次のコントロールに移ります。

DisableAutoValidate プロパティに割り当てると、暗黙的な検証も行われなくなります。 コントロールを検証するには、明示的な検証を使用する必要があります。

明示的な検証

明示的な検証アプローチでは、データが一度に検証されます。 [保存] ボタンや [次へ] リンクのクリックなど、ユーザー操作に応答してデータを検証できます。 ユーザー操作が発生すると、次のいずれかの方法で明示的な検証をトリガーできます。

  • Validate を呼び出して、最後にフォーカスを失ったコントロールを検証する。
  • ValidateChildren を呼び出して、フォームまたはコンテナー コントロール内のすべての子コントロールを検証する。
  • カスタム メソッドを呼び出して、コントロール内のデータを手動で検証する。

コントロールの暗黙的な検証の既定の動作

Windows フォームのコントロールが異なれば、その AutoValidate プロパティの既定値も異なります。 次の表は、最も一般的なコントロールとその既定値を示しています。

コントロール 既定の検証動作
ContainerControl Inherit
Form EnableAllowFocusChange
PropertyGrid プロパティは Visual Studio で公開されない
ToolStripContainer プロパティは Visual Studio で公開されない
SplitContainer Inherit
UserControl EnableAllowFocusChange

フォームを閉じて検証をオーバーライドする

含まれるデータが無効であるためにコントロールがフォーカスを維持している場合、次の通常の方法のいずれかでも親フォームを閉じることはできません。

  • [閉じる] ボタンをクリックする。
  • [システム]>[閉じる] メニューを選択する。
  • プログラムで Close メソッドを呼び出す。

しかし、場合によっては、コントロールの値が有効かどうかに関係なく、ユーザーにフォームを閉じさせることが必要なことがあります。 フォームの FormClosing イベントのハンドラーを作成することにより、検証をオーバーライドして、無効なデータが含まれたままのフォームを閉じることができます。 この場合、Cancel プロパティを false に設定します。 これにより、フォームが強制的に閉じられます。 使用例を含む詳細については、「Form.FormClosing」を参照してください。

注意

この方法でフォームを強制的に閉じる場合、フォームのコントロール内にある、まだ保存されていないデータはすべて失われます。 さらに、モーダル フォームでは、コントロールが閉じられたときにその内容は検証されません。 その場合もコントロールの検証を使用してフォーカスをコントロールにロックすることはできますが、フォームを閉じることに伴う動作について心配する必要はありません。

関連項目