ユーザーがアプリケーションにデータを入力すると、アプリケーションでデータが使用される前にデータが有効であることを確認できます。 特定のテキスト フィールドの長さが 0 ではない、電話番号として書式設定されたフィールド、または文字列に無効な文字が含まれていないことが必要な場合があります。 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型のオブジェクトが指定されます。 コントロールのデータが有効でないと判断した場合は、このオブジェクトの Validating プロパティを Cancelに設定して、true
イベントを取り消します。
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 イベントは発生しませんが、フォーカスは次のコントロールに変わります。
Disable プロパティに AutoValidate を割り当てると、暗黙的な検証が完全に防止されます。 コントロールを検証するには、明示的な検証を使用します。
明示的な検証
明示的な検証アプローチでは、一度にデータが検証されます。 [保存] ボタンや [次へ] リンク クリックするなど、ユーザーの操作に応じてデータ を検証できます。 ユーザー アクションが発生したら、次のいずれかの方法で明示的な検証をトリガーできます。
- Validate を呼び出して、フォーカスが失われた最後のコントロールを検証します。
- ValidateChildren を呼び出して、フォーム コントロールまたはコンテナー コントロール内のすべての子コントロールを検証します。
- カスタム メソッドを呼び出して、コントロール内のデータを手動で検証します。
コントロールの既定の暗黙的な検証動作
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