トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

Visual Studio .NET 2003 C#、フォーム上の入力値チェック

[カテゴリ:言語]
[カテゴリ:C#]
[カテゴリ:メモ]

最初に

入力チェックの方法はいろいろあるが、ここではValidatingを使う方法を考える。便利なのだけど、キャンセル系の動作のときValidatingが発生したりすると、「キャンセルしたいだけなのに、入力エラーでキャンセルできない」というようなことになり「キャンセルするためだけに、正常値を入力」となってしまう。

以下にこの点について調査考察結果を記す。

なお、複数項目がからんだチェックは「OK」ボタンクリックなどでまとめて実施すればよいだけなので、ここでの説明は行わない。

フォーカス移動する際のイベント発生順 と Validating発生の有無 調査

概要

コントロールAからBにフォーカス移動する際のイベント発生順
1.A_Leave
2.A_Validating(入力が不適切な場合は、フォーカスの移動をキャンセルできる)
3.A_Validated
4.B_Enter

ようは、
2.で入力値の妥当性チェック
3.で入力値を正規化
# 仮に整数入力をチェックする場合、2.で0-9までの文字かチェックし
# それ以外の文字が含まれている場合、フォーカス移動をキャンセル
# 3.で"000123"などを"123"に正規化というような感じ。

ところが、フォーム上には「キャンセル」ボタンや、フォーム右上の[X]ボタン、
さらには、プログラムからClose()でフォームを閉じるケースがある。
これらの場合に、Validatingが実行されると都合が悪い。
そのために、CausesValidationがあるのだが、[X]やClose()は独自に回避
する小細工が必要である。

などなどのことについて調査する。

(メインフォームでの)Validating発生の有無

Form1上に以下配置

textBox1
button1(CausesValidation=true)
button2(CausesValidation=false)

textBox1にフォーカスをあてておき、各動作を行ったときの
Validatingイベントの発生有無を調査

■textBox1→button1(CausesValidation=true)クリック
Form1_Load
textBox1_Enter
Form1_Activated
textBox1_Leave
textBox1_Validating # Validatingが発生する。
textBox1_Validated
button1_Enter
button1_Click

■textBox1→button2(CausesValidation=false)クリック
Form1_Load
textBox1_Enter
Form1_Activated
textBox1_Leave
# CausesValidation=false のボタンをクリックしたので
# textBox1.Validating が発生しない。
button2_Enter
button2_Click

■textBox1→button3(CausesValidation=false & this.Close()処理)クリック
Form1_Load
textBox1_Enter
Form1_Activated
textBox1_Leave
button3_Enter
button3_Click
textBox1_Validating
textBox1_Validated
Form1_Closing
Form1_Closed
Form1_Deactivate

■textBox1→右上[×]クリック
Form1_Load
textBox1_Enter
Form1_Activated
textBox1_Validating # Validatingが発生する。
textBox1_Validated
Form1_Deactivate

まとめると。

動作 Validating発生の有無
CausesValidation=trueのボタンクリック
CausesValidation=falseのボタンクリック
Form.Close()
[X]クリック

子フォーム上でのValidating発生の有無

ところが、子フォームの場合、挙動が異なり以下となった。

動作 Validating発生の有無
CausesValidation=trueのボタンクリック
CausesValidation=falseのボタンクリック
Form.Close()
[X]クリック

ということは、子フォームにしてしまえば楽に回避できそう。

参考

フォームの「閉じる」ボタンを無効にする: .NET Tips: C#, VB.NET, Visual Studio:
http://dobon.net/vb/dotnet/form/disabledclosebutton.html

VB コントロールの遷移制御 - Validating, CausesValidationなど:
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard23.htm

最終更新時間:2006年12月23日 03時14分16秒