none
Validatingイベントの検証処理をToolStripMenuItem.Click実行時にも処理させたい RRS feed

  • 質問

  • VB2005ExpressでWindowsFormアプリケーションを開発中です。
    以下のようにTextBoxにValidatingイベントを設定して値検証に成功したらそのままUserのMy.Settingsに値を更新する処理を作りました。

        Private Sub tbxVal_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles tbxVal.Validating
    Dim byt As Byte
    If Byte.TryParse(tbxVal.Text, byt) Then
    My.Settings.Val_ID = byt
    Else
    MessageBox.Show("数値(0~255)を入力してください。")
    e.Cancel = True
    End If
    End Sub

    で、実際に実行するとTextBoxの値をルール範囲で入力してEnterするなりしてValidatingイベントを起こさせると正常に My.Settingsの値が更新されるのですが、同じアプリの中でToolStripMenuItem.Clickを実行した際には Validatingイベントが元のTextBox側で発生せず、My.Settingsの値が古いままになってしまいます。

    ・TextBoxの入力確定時
    ・その他ToolStripMenuItem.Click等の他イベント発生時

    いずれの場合にも上記のような検証処理を走らせるのに、手ごろなイベントがありませんでしょうか。
    ToolStripMenuItem.Click 内部の先頭に汎用検証メソッドを仕掛けるという手も思い浮かぶのですが多少なりとも楽をしたく。
    宜しくお願い致します。
    2009年9月3日 1:26

回答

  • 次のスレッドと関連する話なんでしょうか。

     ToolStripButtonを押すと他のコントロールの変更をコミットせずにイベント飛んでくる
     http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/6d547db3-5f0b-4b45-b11a-ad9d2d84c244
    • 回答としてマーク wataru.kato 2009年9月3日 3:06
    2009年9月3日 2:28
  • ありがとうございます。このスレッドの内容を読んで、とりあえず大まかに解決しました。

    ToolStripMenuItem.Click の先頭行に一律で

            If Not Me.Validate Then Exit Sub

    を入れてみました。一応これで必ずメインフォームのValidateが動作してきちんと評価して止まる動きになりました。

    ただ評価範囲がメインフォーム全体なので、これを適宜下位のコントロールに落として Ctype([適当な下位コントロール],Form).Validate に調整して解決しようと思います。
    大まかと言うのはそういう意味です。
    #他のValidateと競合して無限実行に陥ったりする可能性があるのだろうか…
    • 回答としてマーク wataru.kato 2009年9月3日 3:10
    2009年9月3日 3:10

すべての返信

  • 次のスレッドと関連する話なんでしょうか。

     ToolStripButtonを押すと他のコントロールの変更をコミットせずにイベント飛んでくる
     http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/6d547db3-5f0b-4b45-b11a-ad9d2d84c244
    • 回答としてマーク wataru.kato 2009年9月3日 3:06
    2009年9月3日 2:28
  • ありがとうございます。このスレッドの内容を読んで、とりあえず大まかに解決しました。

    ToolStripMenuItem.Click の先頭行に一律で

            If Not Me.Validate Then Exit Sub

    を入れてみました。一応これで必ずメインフォームのValidateが動作してきちんと評価して止まる動きになりました。

    ただ評価範囲がメインフォーム全体なので、これを適宜下位のコントロールに落として Ctype([適当な下位コントロール],Form).Validate に調整して解決しようと思います。
    大まかと言うのはそういう意味です。
    #他のValidateと競合して無限実行に陥ったりする可能性があるのだろうか…
    • 回答としてマーク wataru.kato 2009年9月3日 3:10
    2009年9月3日 3:10