- - PR -
ToolStripContainer上のコントロールのCuasesValidation
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-04-02 14:30
初めて投稿させていただきます。
よろしくお願いします。 【環境】 言語:VB.NET / Visual Studio 2008 / Windows XP VB.NETを使い始めたばかりの初心者です。 Form上にToolStripContainerを置き、 ToolStripContainerの上に TextBoxとButtonを1つづつ配置しました。 TextBoxのValidatingイベントに入力した値をチェックするコードを書きました。 ButtonのCuasesValidation=Falseに設定してありますが、 Buttonをクリックすると、TextBoxのValidatingが発生してしまいます。 Buttonをクリックしたにもかかわらず、 ActiveControlが「ToolStripContainer」になっているので TextBoxのValidatingイベントが発生しているようです。 ToolStripContainer上にあるButtonをクリックした時に、 TextBoxのValidatingイベントが呼ばれないようにしたいのですが、 何か方法はありますでしょうか? 宜しくお願い致します。 | ||||||||||||
|
投稿日時: 2008-04-02 18:08
こんにちは。
Buttonをクリックした時に検証したくない理由って何かあるんですかね? [ メッセージ編集済み 編集者: ガルマ・ザビ 編集日時 2008-04-02 19:55 ] | ||||||||||||
|
投稿日時: 2008-04-02 18:55
ガルマ・ザビ様
早速の書き込みありがとうございます。
説明不足ですみません。 実際には、Form上に、TextBoxが3個、ComboBoxが1個、Button1(保存)、Button2(中止)とあります。 TextBox、ComboBoxには、それぞれ入力値が正しいかの判断をValidatingイベントで行っています。 入力値が正しくなかった場合、エラーメッセージを表示しています。 そこで、Button2(中止)をクリックして、入力処理を中止してFormを閉じたい。 と思っているのですが、Validatingイベントが発生してしまうので、 Formを閉じることができません。 なぜ、ToolStripContainerを使っているのかと申しますと、 元々は、Buttonではなく、ツールバー(ToolStrip)を使っていました。 しかし、お客様のご要望でButtonに変更になりました。 ただ、ツールバーに戻る可能性も捨て切れないので、 Form上にToolStripContainerとToolStripを残しています。 その様な事情ですので、Button2(中止)をクリックした時に、 Validatingの検証を行わずにFormを閉じたいと思っております。 どうぞ、宜しくお願い致します。 | ||||||||||||
|
投稿日時: 2008-04-02 22:54
ToolStrip のコントロールであるテキスト ボックスやボタンを使わずに、System.Windows.Forms.TextBox や Button を使っている、ということですか?
で、ToolStrip コントロールのテキスト ボックスやボタンの時は、意図通りに機能していたのでしょうか? 単純には、ActiveControl を見て検証ルーチンを通さないとか、ToolStrip の CausesValidation を false にする、などが考えられますが? | ||||||||||||
|
投稿日時: 2008-04-02 23:30
Jitta様
書き込みありがとうございます。
ToolStripは、現在非表示にしています。 使っているのは、System.Windows.Forms.TextBox や Button です。
ToolStrip コントロールのボタンでの動作確認は、まだしておりません。
TextBoxのValidatingイベントの中で ActiveControl を見て検証ルーチンを通さないようにしているのですが、 Button1をクリックした場合も、Button2をクリックした場合も、 どちらも ActiveControl が ToolStripContainer になってしまうのです。 Button2をクリックした時の ActiveControl が Button2 になってくれれば 私のしたい処理が実現できるのですが・・・ お手数お掛けします。 宜しくお願い致します。 | ||||||||||||
|
投稿日時: 2008-04-03 12:00
Buttonイベントの処理で、FormをCloseするようにしていませんかね? この処理をしなければ、「CuasesValidation=False」が効いてくるので、 Validatingイベントが発生してしまうのは、Close処理による影響かと。 以下、調べてみたこと。 FormClosingイベントをフックし、e.CancelをFalseに設定すれば、 Validatingイベント処理で引っかかっても、Formを閉じることはできる。 ただし、Validatingイベント自体は走ってしまうため、走らせないようにするなら、 WndProcメソッドをオーバーライドし、Closeメッセージの時にAutoValidate = AutoValidate.Disableとしてあげる。 そうすると、Validatingイベントは走らない。 、、、皆様のフォロー、お願いします。 | ||||||||||||
|
投稿日時: 2008-04-03 16:42
ガルマ・ザビさん
ありがとうございます! 返信が遅れてしまってすみませんでした。
Buttonイベントの処理でFormをCloseしています。 Me.Close()をコメントにして実行したところ Validatingイベントが発生しませんでした。
はい、確かにFormを閉じることができました!
FormClosingイベントを下記のようにしてみたのですが、Validatingイベントが走ってしまいました。 私の理解不足で申し訳ありません。どこが間違っているのでしょうか? Private Sub Form_Closing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing If e.CloseReason = CloseReason.UserClosing Then AutoValidate = AutoValidate.Disable End If e.Cancel = False End Sub 色々と調べて下さり、大変感謝しております。 どうぞ、宜しくお願い致します。 | ||||||||||||
|
投稿日時: 2008-04-03 17:28
ガルマ・ザビさん、Jittaさん
ありがとうございました。 TextBoxのValidatingイベントの中で ActiveControlを見て検証ルーチンを通さないようにしているところを 下記のようしてみました。
これまでは、 If ActiveControl.CausesValidation = False Then で見ていたのですが、 If ToolStripContainer.ActiveControl.CausesValidation = False Then に変えたところ、検証ルーチンを通らずに抜けることができました。 諸々のアドバイス、本当に感謝しております。 ありがとうございました。 |