- PR -

ToolStripContainer上のコントロールのCuasesValidation

投稿者投稿内容
ななか
会議室デビュー日: 2008/04/02
投稿数: 6
投稿日時: 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イベントが呼ばれないようにしたいのですが、
何か方法はありますでしょうか?

宜しくお願い致します。
ガルマ・ザビ
ベテラン
会議室デビュー日: 2007/06/07
投稿数: 55
お住まい・勤務地: ジオン公国
投稿日時: 2008-04-02 18:08
こんにちは。

引用:


Buttonをクリックしたにもかかわらず、
ActiveControlが「ToolStripContainer」になっているので
TextBoxのValidatingイベントが発生しているようです。




Buttonをクリックした時に検証したくない理由って何かあるんですかね?



[ メッセージ編集済み 編集者: ガルマ・ザビ 編集日時 2008-04-02 19:55 ]
ななか
会議室デビュー日: 2008/04/02
投稿数: 6
投稿日時: 2008-04-02 18:55
ガルマ・ザビ様
早速の書き込みありがとうございます。

引用:

Buttonをクリックした時に検証したくない理由って何かあるんですかね?



説明不足ですみません。
実際には、Form上に、TextBoxが3個、ComboBoxが1個、Button1(保存)、Button2(中止)とあります。
TextBox、ComboBoxには、それぞれ入力値が正しいかの判断をValidatingイベントで行っています。
入力値が正しくなかった場合、エラーメッセージを表示しています。
そこで、Button2(中止)をクリックして、入力処理を中止してFormを閉じたい。
と思っているのですが、Validatingイベントが発生してしまうので、
Formを閉じることができません。

なぜ、ToolStripContainerを使っているのかと申しますと、
元々は、Buttonではなく、ツールバー(ToolStrip)を使っていました。
しかし、お客様のご要望でButtonに変更になりました。
ただ、ツールバーに戻る可能性も捨て切れないので、
Form上にToolStripContainerとToolStripを残しています。

その様な事情ですので、Button2(中止)をクリックした時に、
Validatingの検証を行わずにFormを閉じたいと思っております。

どうぞ、宜しくお願い致します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-02 22:54
ToolStrip のコントロールであるテキスト ボックスやボタンを使わずに、System.Windows.Forms.TextBox や Button を使っている、ということですか?

で、ToolStrip コントロールのテキスト ボックスやボタンの時は、意図通りに機能していたのでしょうか?


単純には、ActiveControl を見て検証ルーチンを通さないとか、ToolStrip の CausesValidation を false にする、などが考えられますが?
ななか
会議室デビュー日: 2008/04/02
投稿数: 6
投稿日時: 2008-04-02 23:30
Jitta様
書き込みありがとうございます。

引用:

ToolStrip のコントロールであるテキスト ボックスやボタンを使わずに、System.Windows.Forms.TextBox や Button を使っている、ということですか?


ToolStripは、現在非表示にしています。
使っているのは、System.Windows.Forms.TextBox や Button です。


引用:

で、ToolStrip コントロールのテキスト ボックスやボタンの時は、意図通りに機能していたのでしょうか?


ToolStrip コントロールのボタンでの動作確認は、まだしておりません。


引用:

単純には、ActiveControl を見て検証ルーチンを通さないとか、ToolStrip の CausesValidation を false にする、などが考えられますが?


TextBoxのValidatingイベントの中で
ActiveControl を見て検証ルーチンを通さないようにしているのですが、
Button1をクリックした場合も、Button2をクリックした場合も、
どちらも ActiveControl が ToolStripContainer になってしまうのです。
Button2をクリックした時の ActiveControl が Button2 になってくれれば
私のしたい処理が実現できるのですが・・・

お手数お掛けします。
宜しくお願い致します。
ガルマ・ザビ
ベテラン
会議室デビュー日: 2007/06/07
投稿数: 55
お住まい・勤務地: ジオン公国
投稿日時: 2008-04-03 12:00
引用:


TextBoxのValidatingイベントに入力した値をチェックするコードを書きました。
ButtonのCuasesValidation=Falseに設定してありますが、
Buttonをクリックすると、TextBoxのValidatingが発生してしまいます。

Buttonをクリックしたにもかかわらず、
ActiveControlが「ToolStripContainer」になっているので
TextBoxのValidatingイベントが発生しているようです。




Buttonイベントの処理で、FormをCloseするようにしていませんかね?
この処理をしなければ、「CuasesValidation=False」が効いてくるので、
Validatingイベントが発生してしまうのは、Close処理による影響かと。

以下、調べてみたこと。

FormClosingイベントをフックし、e.CancelをFalseに設定すれば、
Validatingイベント処理で引っかかっても、Formを閉じることはできる。

ただし、Validatingイベント自体は走ってしまうため、走らせないようにするなら、
WndProcメソッドをオーバーライドし、Closeメッセージの時にAutoValidate = AutoValidate.Disableとしてあげる。

そうすると、Validatingイベントは走らない。

、、、皆様のフォロー、お願いします。
ななか
会議室デビュー日: 2008/04/02
投稿数: 6
投稿日時: 2008-04-03 16:42
ガルマ・ザビさん
ありがとうございます!
返信が遅れてしまってすみませんでした。

引用:

Buttonイベントの処理で、FormをCloseするようにしていませんかね?
この処理をしなければ、「CuasesValidation=False」が効いてくるので、
Validatingイベントが発生してしまうのは、Close処理による影響かと。


Buttonイベントの処理でFormをCloseしています。
Me.Close()をコメントにして実行したところ
Validatingイベントが発生しませんでした。

引用:

FormClosingイベントをフックし、e.CancelをFalseに設定すれば、
Validatingイベント処理で引っかかっても、Formを閉じることはできる。


はい、確かにFormを閉じることができました!

引用:

ただし、Validatingイベント自体は走ってしまうため、走らせないようにするなら、
WndProcメソッドをオーバーライドし、Closeメッセージの時にAutoValidate = AutoValidate.Disableとしてあげる。
そうすると、Validatingイベントは走らない。


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/02
投稿数: 6
投稿日時: 2008-04-03 17:28
ガルマ・ザビさん、Jittaさん
ありがとうございました。

TextBoxのValidatingイベントの中で
ActiveControlを見て検証ルーチンを通さないようにしているところを
下記のようしてみました。

コード:
If ToolStripContainer.ActiveControl.CausesValidation = False Then
    Exit Sub
End If


これまでは、
If ActiveControl.CausesValidation = False Then
で見ていたのですが、
If ToolStripContainer.ActiveControl.CausesValidation = False Then
に変えたところ、検証ルーチンを通らずに抜けることができました。

諸々のアドバイス、本当に感謝しております。
ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)