Windows Forms 入力検証 - エラー項目のフォーカスをロックしないパターン
今回は、コントロールに入力エラーがある場合もフォーカスをはずせるように実装するパターン。
要件前回と同じくこういう画面を考える。
この画面を作る上で、このような要求があるとする。
- TextBox に必須入力チェックを実装する。ただし、エラーがある場合も TextBox からフォーカスがはずせるようにする。
- Register ボタンをクリックした際、画面の全項目の入力チェックを実施し、エラーがあった場合は処理を中止する。
- TextBox に入力エラーがある状態でも、閉じるボタン (タイトルバー右の) が機能する。
以下のようにプロパティとイベントの設定を行う。
Form の設定入力エラー時にもフォーカスをはずせるように実装する場合、ポイントは Form の AutoValidate プロパティです。このプロパティの値を EnableAllowFocusChange に変更すれば、入力エラーがあっても、フォーカスがはずれるようになります。
ただし、AutoValidate を変更しても、入力エラーがあるコントロールにフォーカスが当たっている状態でタイトルバーの閉じるボタンを押した場合、自動的に Close をキャンセルされてしまいます。これを回避するためには、OnFormClosing() をオーバーライドして、e.Cancel = false にします。
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
e.Cancel = false;
}
TextBox の設定
TextBox の入力検証を行う処理を実装する。Validatingイベントハンドラの実装は、フォーカスをはずせなくする場合とまったく同じで、入力エラーがある場合には e.Cancel = true を設定する。ただし、Form の設定により、e.Cancel に true を設定してもフォーカスははずれる。
private void ValidateTextBoxIsNotEmpty(object sender, CancelEventArgs e)
{
TextBox textBox = (TextBox)sender;
if (String.IsNullOrEmpty(textBox.Text))
{
this.errorProvider1.SetError(textBox, "This text box must have value.");
e.Cancel = true;
}
else
{
this.errorProvider1.SetError(textBox, String.Empty);
}
}
Register ボタンの設定
こちらも、フォーカスをはずせるようにする場合と同じ実装。処理を実行する直前に、画面の全コントロールの入力検証を行うために、ValidateChildren() を呼び出し、その戻り値をチェックする。
private void Register(object sender, EventArgs e)
{
if (ValidateChildren())
{
MessageBox.Show("Registration succeeded.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("Registration failed.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Cancel ボタンの設定
Cancel ボタンでは特に設定は必要ない。イベントハンドラでキャンセル処理を実装するだけでよい。
private void Cancel(object sender, EventArgs e)
{
MessageBox.Show("Cancellation succeeded.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
Comments
Post a Comment