- - PR -
VB.netのValidatingイベントについて
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-05-09 21:32
開発環境 VB.net .NET Framework SDK v1.1
1.条件 VB.netにてフォームに二つのテキストボックスがあります。 @txtJisekiSu AtxtSiziSu @のtxtJisekiSuという名称のテキストボックスに下記のようなValidating イベントを書きました。 Private Sub txtJisekiSu_Validating(ByVal sender As ・・・・省略 e.Cancel = True End Sub AのtxtSiziSuという名称のテキストボックスに下記のようなEnter イベントを書きました。 Private Sub txtSiziSu_Enter(ByVal sender ・・・・省略 txtSiziSu.BackColor = g_TextBoxBackColor2 '背景色変更 End Sub 2.現象 txtJisekiSu(テキストボックス)にフォーカスがある場合に 本来ならtxtJisekiSu(テキストボックス)でのValidatingイベント のe.Cancel = TrueによりtxtSiziSu(テキストボックス)をクリックしても txtSiziSu(テキストボックス)のEnterイベントは発生しないはずです。 しかし何度もtxtSiziSu(テキストボックス)をクリックするとまれに Enterイベントは発生してしまいます。 これは不具合なのでしょうか?それとも私のコードに問題があるのでしょうか? | ||||||||
|
投稿日時: 2005-05-09 23:37
マニュアルをきちんと読んでいないことが原因と思われます。EnterイベントはValidatingイベントより先に発生します。
_________________ | ||||||||
|
投稿日時: 2005-05-10 00:39
ご指摘のイベント発生順序は ひとつのコントロールについて 述べられているのでは? コントロール1 の Validating と コントロール2 の Enter の発生順序については記述されていないですよね? コントロール1 の入力検査が完了していないのに 他のコントロール2 に Enter/GotFocus するのは不便な気がします。けど、5.Validating のときには、そのコントロールは 3.LostFocus / 4.Leave を完了しているので、他のコントロールが 1.Enter / 2.GotFocus できてしまう可能性はありそうですね。なぜ、LostFocus のあとに Validating するという仕様になっているんでしょうね・・・。大丈夫なんでしょうか。 ちなみに、Java(Swing) では、LostFocus よりも先に InputVerify(入力検査) が行われ、入力検査に失敗した場合は LostFocus 自体が発生しません。なので、他のコントロールにフォーカスが移ることはありえないようになっています。 | ||||||||
|
投稿日時: 2005-05-10 01:11
実験してみました。 新規にプロジェクトを作成して、TextBox1とTextBox2を配置。 TextBox1にValidatingイベントを、TextBox2にEnterイベントを記述しました。
プロパティがデフォルトのままでも、 CausesValidationプロパティをいろいろいじってみても、 別途Buttonを配置してみて、同様にCausesValidationプロパティをいじってみても、 おっしゃるような現象は再現できませんでした。 理屈から言えば、遷移元のValidatingイベントより遷移先のEnterイベントが 先に発生するとは思えません。(それじゃあ、Validatingにならない) 再現できる必要最小限のソースコードを作成されてはいかがでしょうか? その中で原因が絞り込めるのではないかと思います。 #しかし、TextBox2で右クリックでコンテキストメニューが表示できてしまい、 #貼り付けを選んで、TextBox2に入力できてしまいました・・・。 #これはValidatingの動作としてまずいのでは・・・・ | ||||||||
|
投稿日時: 2005-05-10 22:52
未記入さん>
> ご指摘のイベント発生順序は ひとつのコントロールについて 述べられているのでは? その通りでした。。。 System.Windows.Forms.TextBox, Text: textBox2: Enter System.Windows.Forms.TextBox, Text: textBox2: GotFocus -- ここでアクションを起こす -- System.Windows.Forms.TextBox, Text: textBox2: LostFocus System.Windows.Forms.TextBox, Text: textBox2: Leave System.Windows.Forms.TextBox, Text: textBox2: Validating System.Windows.Forms.TextBox, Text: textBox2: Validated System.Windows.Forms.TextBox, Text: textBox1: Enter System.Windows.Forms.TextBox, Text: textBox1: GotFocus Cancelしたとき System.Windows.Forms.TextBox, Text: textBox1: Enter System.Windows.Forms.TextBox, Text: textBox1: GotFocus -- ここでアクションを起こす -- System.Windows.Forms.TextBox, Text: textBox1: LostFocus System.Windows.Forms.TextBox, Text: textBox1: Leave System.Windows.Forms.TextBox, Text: textBox1: Validating System.Windows.Forms.TextBox, Text: textBox1: Enter System.Windows.Forms.TextBox, Text: textBox2: LostFocus System.Windows.Forms.TextBox, Text: textBox1: GotFocus なお、LostFocusイベントは、キーボードでフォーカスを移動するか、マウスで移動するかによって、発生するタイミングが変わります。おいおい... マー坊さん> TextBox1のValidatingでCancelするようにし、TextBox2をクリックしまくりましたが、textBox2のEnterイベントは発生しませんでした。GotFocusイベントが発生していないのにLostFocusイベントが発生しているのが気になりますが。 なお、.NET Framework 1.1 ServicePack1はあてていますか?なにやら怪しいものがゾロゾロ。。。 ----- 以下、フィードバック内容(別名、いいわけ)
_________________ |
1