Windows フォームでのユーザー入力の検証
ユーザーがアプリケーションにデータを入力するときに、アプリケーションでデータが使用される前にデータが有効であることを確認できます。 特定のテキスト フィールドの長さが 0 ではない、フィールドが電話番号またはその他の種類の整形式データとして書式設定されていること、またはデータベースのセキュリティを侵害するために使用できる安全でない文字が文字列に含まれていないことが必要な場合があります。 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 イベントにコードがある場合、データ バインディングは引き続き発生します。 この場合、
暗黙的および明示的な検証
では、コントロールのデータはいつ検証されますか? これは開発者のあなた次第です。 アプリケーションのニーズに応じて、暗黙的または明示的な検証を使用できます。
暗黙的な検証
暗黙的な検証アプローチでは、ユーザーが入力するとデータが検証されます。 データがコントロールに入力される際に、キーが押されるたびにそれを読み取ってリアルタイムで検証したり、より一般的には、ユーザーが入力フォーカスを1つのコントロールから外して次のコントロールへ移動する際に検証することができます。 この方法は、作業中のデータに関するフィードバックをユーザーにすぐに提供する場合に便利です。
コントロールに暗黙的な検証を使用する場合は、そのコントロールの AutoValidate プロパティを EnablePreventFocusChange または EnableAllowFocusChangeに設定する必要があります。 Validating イベントを取り消すと、コントロールの動作は、AutoValidateに割り当てた値によって決まります。 EnablePreventFocusChange割り当てた場合、イベントを取り消すと、Validated イベントは発生しません。 ユーザーがデータを有効な入力に変更するまで、入力フォーカスは現在のコントロールに残ります。 EnableAllowFocusChange割り当てた場合、イベントをキャンセルしても Validated イベントは発生しませんが、フォーカスは次のコントロールに変わります。
AutoValidate プロパティに Disable を割り当てると、暗黙的な検証が完全に防止されます。 コントロールを検証するには、明示的な検証を使用する必要があります。
明示的な検証
明示的な検証アプローチでは、一度にデータが検証されます。 [保存] ボタンや [次へ] リンクをクリックするなど、ユーザーアクションに応答してデータを検証できます。 ユーザー アクションが発生したら、次のいずれかの方法で明示的な検証をトリガーできます。
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を参照してください。
手記
この方法でフォームを強制的に閉じると、まだ保存されていないフォームのコントロール内のすべてのデータが失われます。 また、モーダル フォームでは、閉じているコントロールの内容は検証されません。 コントロールの検証を使用してコントロールにフォーカスをロックすることはできますが、フォームを閉じることに関連する動作について心配する必要はありません。
関連項目
.NET Desktop feedback