Hatena::ブログ(Diary)

Kazzzの日記 このページをアンテナに追加 RSSフィード

2006-07-01

[]CausesValidation


System.Windows.Forms.Control.CausesValidationプロパティは、そのコントロールフォーカスを得た際にフォーカスを失ったコントロールのValidatingイベントが発生するか、しないかを制御するはずなのだが、

private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Button button1;
private void InitializeComponent()
{
    this.button1.CausesValidation = false;
    〜
}
private void button1_Click(object sender, EventArgs e)
{
    this.Close();
}
private void textBox1_Validating(object sender, CancelEventArgs e)
{
    MessageBox.Show("Validating!!");
}

こんな感じの最小構成でテストしたのだが、button1.CausesValidation=falseとしているにもかかわらず、実行してButton1を押下すると何度試してもValidatingイベントが発生してしまう。
f:id:Kazzz:20060701010453p:image

Validatingイベントを抑制するには、イベントハンドラ
private void textBox1_Validating(object sender, CancelEventArgs e)
{
    if ( Form.ActiveForm.ActiveControl != null )
    {
        if (!Form.ActiveForm.ActiveControl.CausesValidation)
        {
            return;
        }
    }
    MessageBox.Show("Validating!!");
}

みたいに書くしかないんだが。

これは私がCausesValidationの意味を履き違えているのか、それとも仕様なのか(仕様だとしたらあまりに間抜けだが)はたまたバグなのだろうか。

追記:やはり仕様なのか?

名無し名無し 2006/07/02 14:09 FYI

private void button1_Click(object sender, EventArgs e)
{
this.AutoValidate = AutoValidate.Disable;
this.Close();
}

KazzzKazzz 2006/07/02 14:37
>this.AutoValidate = AutoValidate.Disable;
 サンプルコード同様に、FormをCloseするのが前提であれば、これでも良いかもしれませんね。
 でも、根本的な解決にはなっていないですね。

名無し名無し 2006/07/02 22:28 どうもです。少し補足しておきます。

問題がTextBoxのValidatingイベントが発生する点だと思ったので、今回Validatingを発生させているCloseメソッドに対して、AutoValidate を Disableにすることで暗黙的なValidatingを抑制させるアイデアを参考までにお知らせしました。Validatingが発生するorしないの違いがあるということです。あと、validatingイベントに個別にコードが記述する点が気になったので。。。

(ちなみにbutton処理のclose処理を取り除くと、Buttonへのフォーカス移動ではValidatingが発生しないところまで切り分けられているという前提でお知らせしました)

もし、別の問題があったのであればコメントを無視してください。

KazzzKazzz 2006/07/03 07:08 コメントありがとございます。

>問題がTextBoxのValidatingイベントが発生する点だと思ったので
そうです。これが問題に相違ありません。

>validatingイベントに個別にコードが記述する点が気になったので。。。
サンプルはあくまで、問題を簡単に見せるための例であって、私も通常ならばvalidatingイベントに直接自分のコードは書かないと思います。
>ちなみにbutton処理のclose処理を取り除くと、Buttonへのフォーカス移動ではValidatingが発生しないところまで切り分けられているという前提でお知らせしました
これは私も確認しています。
しかし、だからといって、CausesValidationプロパティに関する振る舞いがCloseメソッドの有無によって変わるのはおかしいと思ったのです。
CausesValidationプロパティが、”それまでフォーカスを持っていたコントロールのValidatingイベントの発生を制御する”という役割を持っている以上、Closeメソッドが呼ばれたか否かには関係なく、そのように振舞って欲しいのです。Closeメソッドが呼ばれた場合、一切の検証は不要だというケースは多いですし。

名無し 名無し 2006/07/03 09:15 なるほど、

確かにCloseメソッドで Validating が発生するのは直感的でないですね。少なくとも、CloseメソッドにValidatingを制御する引数があるとベターな気はしますね。
CloseメソッドはWM_CLOSEを送信しているようですね(笑)

#AOP関連について いつもblogを参考にさせていただいています。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/Kazzz/20060701/p1