QA@IT

WindowsFormのTabControlを制御する際の設計について

5804 PV

WindowsFormでTabControlを使って、タブ形式のアプリケーションを作成しているのですが、タブの制御について困っていることがあります。

現在の構成
・MainとなるFormにTabControlを貼り付けている。
・TabControlで使用するタブはコード上で動的に生成している。
・タブには、カスタムコントロール化したテキストボックスを動的に生成して、AddControlしている。

このような構成で、テキストボックス内で文字列を選択し、F1を押すと、選択した文字列に一致する名前を持った他のタブがアクティブ化されるような事をやりたいと考えています。

ここで問題になったのが、カスタムコントロール化したテキストボックスはそのままの状態では、
親であるタブのクラスや、さらに親のTabControlのクラスを持っておらず、
F1キーを押したkeydownイベントの中で他のタブの情報を参照したり、TabControl.SelectedTabを書けないことです。

そこで質問なのですが、この構成をなるべく維持したまま目的の動作をさせたい場合、どのような手法が考えられるでしょうか?
テキストボックス内のコードで、this.Parentで親を取得する方法や、
下位のコントロールを生成する場合に親のクラスを渡してあげるなどを思いついたのですが、何かいまいちしっくり来ず、
もっと良い方法がないか検討をしています。

抽象的な質問で恐縮ですが、知恵をお貸しいただけると幸いです。

回答

ヒント
Parent プロパティ
as 演算子

あら?Parent じゃだめ?
どう「しっくりこない」のでしょうか。
大抵は、イベントを追加するでしょうね。

mousedown と混同していました。keyはdownですね。

編集 履歴 (2)
  • 回答ありがとうございます。

    「しっくりこない」理由ですが、
    テキストボックスに追加したイベントからTabControlを操作する場合、
    子(この場合は孫に当たりますが)が親を制御するような形になるため、
    それに違和感がある感じです。
    -
  • では、「キーボードの操作がされた」というイベントをキャンセルし、ほかのイベントを挙げるというのはどうでしょうか。 -
  • 親(TabControl)側でイベントをキャッチできるのがイメージとしては理想なのですが、そのような事は可能なのでしょうか。 -
  • 可能/不可能で言えば「可能」ですよ。テストコード作って確認済み。ただし、コードを投稿できる環境がないので、出せませんが。 -
  • https://1drv.ms/u/s!AiQzlIklFkpNjR0j4TQ0SaF0QHcP
    サンプルプロジェクト
    -
  • atmatkit10063.zip です。 -
  • サンプルまでありがとうございます。
    まさにイメージ通りの作りでした!
    こちらを参考に、より良いソフト作りを目指してみます。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。