前回までの記事はこちら
- [Tips] Validatingイベントを使用する その1 ~ 基本的な使い方 ~
- [Tips] Validatingイベントを使用する その2 ~ ErrorProviderコントロールとの組み合わせ ~
Validatingイベントで入力チェックを実施し、 e.Cancel = true にすることで、他のコントロールへフォーカスが移動できなくなるのはこれまでに説明した通りです。
今回は、Validatingイベント後のフォーカス移動先が、[キャンセル]や[閉じる]ボタンの場合を考えてみます。
前回までに作成したプログラムで実験をしてみましょう。
1.データ1のテキストボックスに「hiros.net」と入力します。
2.[閉じる]ボタンをクリックします。
現在までのコードだと、データ1に不正な文字が入力されている場合は下図のようになり、当然画面を閉じることはできません。
画面を閉じたければ、エラーを修正するしか方法がありません。
上記の問題を解決するには、Validatingイベントを発生させたくないコントロールの CauseValidationプロパティに falseをセットする必要があります。
このように設定を行うと、データ1のテキストボックスに不正があったとしても、フォーカスが[閉じる]ボタンへ移動しても、Validatingイベントは発生しなくなり、エラーを修正しなくても画面を閉じることができるようになります。
次にフォーム右上の[X]ボタンはどうでしょうか。
これも、データ1のテキストボックスにエラーがある場合は、画面を閉じることができません。
この問題は、Validatingイベント内で ActiveControlをチェックすることで回避することが可能です。
通常、Validatingイベントが発生した場合は、ActiveControlプロパティはすでに次のコントロールになっています。
今回の例では、txtData1のValidatingイベントが発生すると、ActiveControlの値はtxtData2となります。
しかし、[Esc]やフォーム右上の[X]ボタンがクリックされた場合には、ActiveControlプロパティの値は txtData1のままとなっているのです。
これを図にすると以下のようになります。
以上のことを利用すると、txtData1のValidatingイベントの中で e.Cancel = true にする条件は
1.不正な文字が含まれている
2.ActiveControlがtxtData1以外のとき
の2つを満たしているときとなります。
コード例は以下の通りです。
VBの例
Private Sub txtData1_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles txtData1.Validating ' 不正な文字「.」が含まれている かつ ActiveControlがtxtData1ではない If txtData1.Text.IndexOf(".") > -1 AndAlso ActiveControl IsNot txtData1 Then MessageBox.Show("不正な文字「.」が含まれています") ' 後続のイベントをキャンセル e.Cancel = True 'txtData1 にエラーアイコンとメッセージの表示をセット errorProvider1.SetError(txtData1, "不正な文字が入力されています。") End If End Sub
C#の例
private void textBox1_Validating(object sender, CancelEventArgs e) { // 不正な文字「.」が含まれている かつ ActiveControlがtxtData1ではない if (txtData1.Text.IndexOf('.') > -1 && ActiveControl != txtData1) { MessageBox.Show("不正な文字「.」が含まれています"); // 後続のイベントをキャンセル e.Cancel = true; // txtData1 にエラーアイコンとメッセージの表示をセット errorProvider1.SetError(txtData1, "不正な文字が入力されています。"); } }
以上で、フォームの[X]ボタンクリック時に Validatingイベントを発生することなくフォームを閉じることができるようになります。
コメント