none
SplitContainerの動作について RRS feed

  • 質問

  • Form上にSplitContainerと、TextBox(textBox1)を配置します。

    さらにSplitContainerのPanel1にTextBox(textBox2)を配置します。

    この状態で、のtextBox1とtextBox2のValidatingで以下のコードを書きます。

    private void textBox1_Validating(object sender, CancelEventArgs e)
    {
    	if (textBox1.Text == "1")
    		e.Cancel = true;
    }
    
    private void textBox2_Validating(object sender, CancelEventArgs e)
    {
    	if (textBox2.Text == "1")
    		e.Cancel = true;
    }
    
    

    この状態で実行し、textBox1にフォーカスがある場合で、かつ、"1"が入っている場合、textBox1から移動することが出来ないので、textBox2にフォーカスを移すことも、Formを[×]ボタンで閉じることもできません。

    しかし、SplitContainer上のtextBox2にフォーカスがある場合で、かつ、"1"が入っている場合、Tabキーを3回押下すると、textBox1にフォーカスが移動してしまいます。 (1回目の押下でスプリッターにフォーカスが移動し、2回目の押下でtextBox2のValidatingが2回発生し、3回目でtextBox1に移動します) ただし、マウスでtextBox1に移動しようとすると、移動しません。

    この現象(e.Cancel=trueにしているのに、フォーカスが移動してしまう現象と、Validatingが2回発生する現象)について、何か情報をお持ちの方がいらっしゃいましたら、教えて頂けると助かりますので、宜しくお願い致します。

    実行環境:Windows7 、 VS2005Pro Sp1 + update for vista 、 .NET Framework 2.0 Sp2

    2010年7月9日 10:41

すべての返信

  • 試してみましたが、確かに仰る通りの現象が発生します。

     

    SplitContainer.Panel1にテキストボックスを2つ配置してやってみると、

    最初のテキストボックスは問題なくValidatingイベントが発生し、二つ目のテキストボックスでは

    同様の現象になります。

    Panel内の最後のインデックスのコントロールからTab遷移した際に、発生する模様です。

    そもそもValidateイベントが発生するタイミングがおかしく、2度発生するのはバグではないかと思われます。

     

    ちなみに、回避策といいますか、SplitContainerのTabStopをFalseに設定すると、

    問題なくValidatingが発生しました。

    仕様的に、この方法で回避出来るのであればよいですが・・・

     

    追記

    ちなみに、Leaveイベントは、上記のような現象はおこらず、正しくイベントが発生しました。

    CausesValidationプロパティもTrueになっていることも確認済み。

    • 編集済み honefai 2010年7月9日 11:32 追記
    • 回答の候補に設定 山本春海 2010年7月13日 5:22
    2010年7月9日 11:23
  • honefaiさん、ご返信ありがとうございます。

    TabStop=falseでTabキー押下でフォーカスが移動してしまう現象は起こらなくなりました!ありがとうございます!!

     

    ただし、残念ながら、Validatingが発生するタイミングや、回数がおかしいのは変わらずです。

    例えば、SplitContainer上のtextBox2にフォーカスがある際に、マウスでスプリッターを操作し、SplitContainer外のtextBox1にフォーカスを入れると、その瞬間に、textBox2のValidatingが発生します。続いて、textBox2にフォーカスを入れると、textBox1のValidatingに続いて、何故かtextBox2のValidatingが発生します。

    この場合、スプリッターをマウスで操作することをしなければ、2回目のtextBox2のValidatingは発生しません。

    2010年7月12日 1:02