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

Popular posts from this blog

TFS: 別PCでのチェックアウトを取り消す

WPF の RichTextBox に文字列を設定する&取り出す

WPFアプリにアニメーションGIFを表示させる