- PR -

ToolStripContainer上のコントロールのCuasesValidation

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-03 21:29
 ん。。。CausesValidation が true のコントロールにフォーカスが移動した場合、すべてのコントロールの Validating が実行されるようですね。Validating イベントなどの説明にあるイベントの発生順から、Leave の発生したコントロールの Validating イベントだけが発生するのだと思いこんでいた。。。

 ただ、私のところ(VS2005 C#)で試した限りでは、
引用:

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


という状況は、確認できませんでした。と思ったら、Form.Close しているからなのか。それは思い至らなかった。

 Form.CausesValidation を false にしても、Form にフォーカスが移るような処理で Validating が走るのは仕様です。これ、VS2005 のベータでフィードバックしました→CausesValidation を false にした時の動作について<microsoft.com>

引用:

Buttonイベントの処理でFormをCloseしています。
FormClosingイベントを下記のようにしてみたのですが、Validatingイベントが走ってしまいました。


 Button イベントの処理で、Form.Close の前に AutoValidate を変更すればいいのでは?

引用:

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


え???それだと、どんな場合も検証しないような気がしますけど?
ななか
会議室デビュー日: 2008/04/02
投稿数: 6
投稿日時: 2008-04-03 22:39
Jittaさん
書き込みありがとうございます。

引用:

ん。。。CausesValidation が true のコントロールにフォーカスが移動した場合、すべてのコントロールの Validating が実行されるようですね。Validating イベントなどの説明にあるイベントの発生順から、Leave の発生したコントロールの Validating イベントだけが発生するのだと思いこんでいた。。。


いえ、Validatingイベントが実行されているのは、
Leave の発生したコントロールだけです。

引用:

Button イベントの処理で、Form.Close の前に AutoValidate を変更すればいいのでは?


できました!
Button2 イベントの処理を下記のようにしたところ、
TextBoxのValidatingイベント発生することなく、フォームを閉じることができました。

AutoValidate = AutoValidate.Disable
Me.Close()

なるほど。こういう方法もあるのですね。
勉強になります。

引用:

引用:

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


え???それだと、どんな場合も検証しないような気がしますけど?


ToolStripContainer上にButton1(保存)とButton2(中止)があり、
Button1は、CausesValidation=Trueになっているので
検証ルーチンを抜けずにチェック処理が行われます。
Button2は、CausesValidation=Falseになっているので
検証ルーチンを通らずに抜けます。

最初の
If ActiveControl.CausesValidation = False Then
だと、この場合の ActiveControl は、ToolStripContainer になり、
ToolStripContainer は、CausesValidation=True になっているので
ToolStripContainer上のどのButtonをクリックしても、
検証ルーチンを通っていました。

それを、
If ToolStripContainer.ActiveControl.CausesValidation = False Then
と、変えたところ、ToolStripContainerの中で、Active になっている
コントロールの CausesValidation を参照できるようになったので、
私のしたいことが実現できるようになりました。

ここにたどりつくまでに、
貴重な時間を割いて、色々な事を教えてくださった
Jittaさん、ガルマ・ザビさん
本当にありがとうございました。

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