Windows フォームでのユーザー入力の検証

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

MaskedTextBox コントロールによる検証

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

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

詳細については、「MaskedTextBox コントロール」を参照してください。

イベント ドリブン検証

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

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

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

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

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

TextBox でメール アドレスを検証するコード例については、Validating を参照してください。

データ バインディングとイベント ドリブン検証

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

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

重要

Validating イベントの後に実行されるカスタム検証がある場合、データ バインディングには影響しません。 たとえば、Validated イベントに、データ バインディングをキャンセルしようとするコードが含まれている場合でも、データ バインディングは発生します。 この場合、Validated イベントで検証を行うには、コントロールの [Data Source Update Mode](データ ソース更新モード) プロパティ ((Databindings)\(詳細) の下にある) を [OnValidation] から [なし] に変更し、コントロール.DataBindings["<YOURFIELD>"].WriteValue() を自分の検証コードに追加します。

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

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

暗黙的な検証

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

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

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

明示的な検証

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

  • Validate を呼び出して、最後にフォーカスを失ったコントロールを検証する。

  • ValidateChildren を呼び出して、フォームまたはコンテナー コントロール内のすべての子コントロールを検証する。

  • カスタム メソッドを呼び出して、コントロール内のデータを手動で検証する。

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

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

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

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

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

  • [閉じる] ボタンをクリックする。

  • [システム] メニューの [閉じる] を選択する。

  • プログラムで Close メソッドを呼び出す。

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

注意

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

関連項目