none
SplitContainerを持つユーザーコントロールでのタブ移動 RRS feed

  • 質問

  • TabStop=FalseとしたSplitContainerを持つユーザーコントロールを作成したのですが、これをForm1に配置するとForm1上でのタブ移動がこのユーザーコントロールで止まってしまいました。
    どのように設定すればタブ移動が止まらないようにできるのでしょうか?

     

    以下が私の行ったことです。

    ・WindowsApplication1を新規作成
    ・ユーザーコントロールの追加→UserControl1.vbを作成
    ・UserControl1.vbにTextBox(とりあえずtbBと呼びます)とSplitContainer(spB)を配置、タブオーダーは以下全てコントロールの作成順です。
    ・SplitContainer(spB)のTabStopをFalseに設定
    ・一旦ビルドする
    ・Form1にTextBox(tbA)と先程作成したUserControlを配置
    ・実行する
    ・TABキーを押すと、フォーカスが以下のように振る舞います。

     

     tbA→tbB→移動しなくなる

     

    tbA→tbB→tbA→tbB→…という動作を希望しています。何かプロパティの設定が足りないのでしょうか?

     

    ちなみに、
    ・spBのEnabledをFalseにすると希望する動作になりましたが、実際にはspBの中にボタンを配置する予定で、Enabled=Falseにするとこのボタンが押せなくなるので、この方法は取れません。
    ・ユーザーコントロールを使わないで、空のフォームにTextBox1とTextBox2とSplitContainer1を配置し、SplitContainer1のTabStopをFalseに設定すると、タブ移動はTextBox1→TextBox2→TextBox1→TextBox2→…とサイクルしました。

     

    環境:Windows Vista, VB2005 Exp, .NET 2.0, Windowsアプリケーション

     

    2007年9月6日 7:38

回答

  • yuki-m さん、こんにちは
    ダッチです。

    変わった現象ですね。バグっぽい感じもしますが。

    私も試してみたところ現象が発生しました。
    SplitContainer がコンテナ内(ユーザコントロールやパネル)の最後のタブオーダーの場合に今回の現象が発生するようです。
    ユーザコントロール内に TextBox1、SplitContainer1、TextBox2 の順で作成すると現象が発生しなくなりました。
    TextBox1、TextBox2、SplitContainer1 の順にするとまた現象が発生します。

    回避策ですが spB の TabIndex を tbB と 同じにしてやる事で、意図した動きになるようです。

    作成順で行けば、tbB.TabIndex = 0、spB.TabIndex = 0 にすればいいです。
    2007年9月6日 13:32

すべての返信

  •  

    自己レスになります。


    今回の場合、無理にSplitContainerを使わずともよかったので(実は自前のNumericUpDownを作ろうとしていました)、Panelを使って逃げました。
    勢いで投稿して少し反省…。

     

    しかし一応立ててしまったので、少し様子を見てからスレを閉めます。

    2007年9月6日 8:10
  • yuki-m さん、こんにちは
    ダッチです。

    変わった現象ですね。バグっぽい感じもしますが。

    私も試してみたところ現象が発生しました。
    SplitContainer がコンテナ内(ユーザコントロールやパネル)の最後のタブオーダーの場合に今回の現象が発生するようです。
    ユーザコントロール内に TextBox1、SplitContainer1、TextBox2 の順で作成すると現象が発生しなくなりました。
    TextBox1、TextBox2、SplitContainer1 の順にするとまた現象が発生します。

    回避策ですが spB の TabIndex を tbB と 同じにしてやる事で、意図した動きになるようです。

    作成順で行けば、tbB.TabIndex = 0、spB.TabIndex = 0 にすればいいです。
    2007年9月6日 13:32
  •  ダッチ さんからの引用

    SplitContainer がコンテナ内(ユーザコントロールやパネル)の最後のタブオーダーの場合に今回の現象が発生するようです。
    ユーザコントロール内に TextBox1、SplitContainer1、TextBox2 の順で作成すると現象が発生しなくなりました。
    TextBox1、TextBox2、SplitContainer1 の順にするとまた現象が発生します。

     

    本当ですね。私はここまで原因切り分けができなかったので、勉強になりました。

    とりあえずこのようなケースでSplitContainerを使う事はできるだけ避けて、だめな場合はダッチ様のアドバイスのようにTabIndexを同じにしてみようと思います。ありがとうございました。

     

    #余談ですが、このような回避策(TabIndexを同じに)は思いつきもしませんでした。(TabIndexは全て別々の値を持つものだと思い込んでいましたので…)
    似たような事例があったのでしょうか?もしよろしければ教えて下さいませんか?

    2007年9月6日 14:25
  •  yuki-m さんからの引用

    #余談ですが、このような回避策(TabIndexを同じに)は思いつきもしませんでした。(TabIndexは全て別々の値を持つものだと思い込んでいましたので…)
    似たような事例があったのでしょうか?もしよろしければ教えて下さいませんか?


    特に似たような事例はありません。

    ただ TabStop を False にした場合に Tab キーでフォーカスが来た場合は、次のタブオーダーにフォーカスが移るとドキュメントに記載されていたことと、
     ダッチ さんからの引用
    ユーザコントロール内に TextBox1、SplitContainer1、TextBox2 の順で作成すると現象が発生しなくなりました。
    TextBox1、TextBox2、SplitContainer1 の順にするとまた現象が発生します。
    この動作から TabIndex が絡んでいるのではないかと推測しました。
    後は試せることは全て試す勢いでいろいろ触ってみただけすよ。

    # それと回答チェックは自分につけるのではなく、解決した回答に付ける仕組みなようですよ。

    2007年9月7日 1:11
  •  

    返信ありがとうございます。

     

     ダッチ さんからの引用

    ただ TabStop を False にした場合に Tab キーでフォーカスが来た場合は、次のタブオーダーにフォーカスが移るとドキュメントに記載されていたことと、
     ダッチ さんからの引用
    ユーザコントロール内に TextBox1、SplitContainer1、TextBox2 の順で作成すると現象が発生しなくなりました。
    TextBox1、TextBox2、SplitContainer1 の順にするとまた現象が発生します。
    この動作から TabIndex が絡んでいるのではないかと推測しました。
    後は試せることは全て試す勢いでいろいろ触ってみただけすよ。

     

    そうなんですかー。私にももっと推測能力が欲しいです。

     

     ダッチ さんからの引用

    # それと回答チェックは自分につけるのではなく、解決した回答に付ける仕組みなようですよ。

     

    思いっきり押し間違えたようです(^^;;つけ直しておきます。

    2007年9月7日 1:52