none
MDI 子フォーム内のコントロールのフォーカス RRS feed

  • 質問

  • VB.NET 2008、Framewrok3.5です。

    MDI内の、子フォームAがアクティブな時に、子フォームBをアクティブにします。
    すると、子フォームA内のアクティブなコントロール(TextBoxなど)が失われます。(TabIndexが一番若いものがアクティブになる)

    この現象が確認できるのは、子フォームA内にある、System.Windows.Forms.UserControl、 System.Windows.Forms.SplitContainerSystem.Windows.Forms.ToolStripContainer 内のコントロールがアクティブな時に発生します。

    原因はわかりませんが、アクティブなコントロールを失ってほしく無いので、LeaveでActiveControlを保存しておき、Enterイベントで復元すればよいかと思っていたのですが、問題となっているUserControl、 SplitContainer、 ToolStripContainer内のコントロールがアクティブな時は、 アクティブなコントロールではなく、問題のUserControl、 SplitContainer、 ToolStripContainer までしか取得できません。

    何か、回避策は無いでしょうか?



    #問題のコントロールは、ContainerControlを継承しているようですので、ContainerControlがあやしいと思っています。
    2010年2月4日 7:55

回答

  • 取り敢えずアクティブなコントロールについては、ActiveControl が ContainerControl の場合その ActiveControl を再帰的に探すようにすればいいでしょう。

    static Control FindActiveControl(Control ctrl) {
        ContainerControl container = ctrl as ContainerContrl;
        return (container == null) ? ctrl : FindActiveControl(container.ActiveControl);
    }
    
    // Form1 内のメソッドで呼び出す
    lastActiveControl = FindActiveControl(this);


    本質的な問題の方は分かりませんねー。
    • 回答としてマーク Hiru.x 2010年2月4日 10:46
    2010年2月4日 8:38

すべての返信

  • 取り敢えずアクティブなコントロールについては、ActiveControl が ContainerControl の場合その ActiveControl を再帰的に探すようにすればいいでしょう。

    static Control FindActiveControl(Control ctrl) {
        ContainerControl container = ctrl as ContainerContrl;
        return (container == null) ? ctrl : FindActiveControl(container.ActiveControl);
    }
    
    // Form1 内のメソッドで呼び出す
    lastActiveControl = FindActiveControl(this);


    本質的な問題の方は分かりませんねー。
    • 回答としてマーク Hiru.x 2010年2月4日 10:46
    2010年2月4日 8:38
  • 回答ありがとうございます。

    ContainerControlにキャストしてしまえば、ActiveControlを取得できるのですね。
    再帰処理で探すようにして、アクティブなコントロールの取得に成功しました。


    おかげさまで、思い通りの動作を実現できました。
    ありがとうございます。
    2010年2月4日 10:46