none
TabControlを自作するには(ListBox+Panelなど) RRS feed

  • 質問

  • ダイアログで1シートを越える内容を複数のシートに分けてページを切り替えるのには、通常TabControlを使用すると思います。
    しかし最近、左側にListBoxやTreeViewを配置してこちらでページをめくり、右半分の領域を切り替えるタイプのダイアログが多く設計されています。
    これをSystem.Windows.Formsで作成するにはListBox+Panelという構成になるかと思いますが、何か参考になるようなオープンソースのプロダクトや、ライブラリ化されたものなどはございませんでしょうか?

    ちなみに右側にTabControlを配置することで楽をできないかと考えたのですが、残念ながらTabControlのタブだけを非表示にすることはできないようで断念したところです。
    2009年11月28日 15:07

回答

  • ベタにやるなら、1ページごとに UserControl として別途画面を作ったり、コーディングしたりしておき、すべてのページをフォーム側では同じ座標に配置する。
    表示中のページ以外を担当するコントロールは非表示にしておき、ListBox や TreeView の選択状態次第で、表示状態を制御するってところでしょうか。

    Tab のない、TabControl も頑張れば自作できると思いますが、結構大変かもしれません。
    (本気でやるなら、デザイナに対するサポート機能を実装する必要が出てくる)
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク kanryu 2009年12月1日 9:24
    2009年11月28日 17:45
    モデレータ

すべての返信

  • ちなみに右側にTabControlを配置することで楽をできないかと考えたのですが、残念ながらTabControlのタブだけを非表示にすることはできないようで断念したところです。
    TabControlのAppearanceプロパティをButtonsにし、その表示されたButtonの上にLabelを配置して隠してしまうというのではダメですかね・・・
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年11月28日 16:30
    モデレータ
  • ベタにやるなら、1ページごとに UserControl として別途画面を作ったり、コーディングしたりしておき、すべてのページをフォーム側では同じ座標に配置する。
    表示中のページ以外を担当するコントロールは非表示にしておき、ListBox や TreeView の選択状態次第で、表示状態を制御するってところでしょうか。

    Tab のない、TabControl も頑張れば自作できると思いますが、結構大変かもしれません。
    (本気でやるなら、デザイナに対するサポート機能を実装する必要が出てくる)
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク kanryu 2009年12月1日 9:24
    2009年11月28日 17:45
    モデレータ
  • ベタにやるなら、1ページごとに UserControl として別途画面を作ったり、コーディングしたりしておき、すべてのページをフォーム側では同じ座標に配置する。
    表示中のページ以外を担当するコントロールは非表示にしておき、ListBox や TreeView の選択状態次第で、表示状態を制御するってところでしょうか。

    Tab のない、TabControl も頑張れば自作できると思いますが、結構大変かもしれません。
    (本気でやるなら、デザイナに対するサポート機能を実装する必要が出てくる)
    何もないところから普通に作っていくとすれば、やはりそんな感じになるでしょうか。
    UserControlで作成すると各シートごとに別クラスになり、サイズを合わせるのが面倒くさいのが難点ですね。
    とはいえ1シートに表示しきれないから複数のシートに分けるわけで、全部1個のクラスで管理したらコントロールのメンバがすごい数になってしまって管理が大変かもしれません。従って、悪くない方策なのかもしれないですね。
    PanelにUserControlを貼り付けると、親フォームで用意した枠より大きなシートを表示すると自動的にスクロールバーが表示されるので、かなりいい感じです。
    そしてプロパティーシートのごとく、親のフォームを単独で実装できるのもいいところですね。

    あと、これだけ多くの情報をアプリ本体とやり取りするのはどういう形が考えられるでしょうか。
    一般的にはアプリケーションの設定ファイルとそのインターフェイスとなるデザイナが生成するstaticクラスを介することになるでしょうか。
    今回の場合、各シートと親ダイアログとアプリケーション本体との間で情報の更新を行っていく必要があり、配慮しないといけないことが多くなりそうです。
    2009年11月28日 19:17
  • 今回の場合、各シートと親ダイアログとアプリケーション本体との間で情報の更新を行っていく必要があり、配慮しないといけないことが多くなりそうです。
    理想を言えば、下記のようなイメージです。

    現在の設定値を画面に表示する
    →フォーム側からユーザコントロールのプロパティに設定する。

    画面から設定値を取得する
    →フォーム側からユーザコントロールのプロパティを取得・収集する。

    画面での変更操作を受けて何か動かす
    →ユーザコントロールにイベントを用意・公開し、フォーム側からはイベントハンドラを登録する。

    # あくまで理想です。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2009年11月29日 0:42
    モデレータ
  • 試したわけじゃないですが、
    TabControlの中の1枚1枚はTabPageでPanelの派生クラス、コンストラクタもpublicです。なのでそのまま使えそうです。
    TabControlはsealedされていないので派生クラスを作れます。タブボタン部分を隠すようにできたらこの辺りを流用できるのかもしれません。

    こういうところはWPFの方が柔軟なのでしょうか?
    2009年11月29日 1:00
  • こういうところはWPFの方が柔軟なのでしょうか?
    確かにWPFだと簡単にできてしまいますので、この部分だけWPFで作成するっていうのはありのような気がします。

    #お~、WPFとSilverlight4の違いがこんなところにもあった。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年11月29日 1:21
    モデレータ
  • ベタにやるなら、1ページごとに UserControl として別途画面を作ったり、コーディングしたりしておき、すべてのページをフォーム側では同じ座標に配置する。
    表示中のページ以外を担当するコントロールは非表示にしておき、ListBox や TreeView の選択状態次第で、表示状態を制御するってところでしょうか。

    Tab のない、TabControl も頑張れば自作できると思いますが、結構大変かもしれません。
    (本気でやるなら、デザイナに対するサポート機能を実装する必要が出てくる)
    トピックを投稿した段階の予想を超える回答ではなかったものの、特に問題なく実装できていますので
    ひとまずこのトピックの回答とさせていただきます。

    ※Page(UserControl)のサイズを変更すると、親フォームでデザイナーが勝手にサイズを指定してしまってる関係で大きさが狂ってしまうことがありますね。手動で削除するか、AutoSize = True;にする必要があるようです。

    よりエレガントな実装法などをご存知でしたら、引き続き情報を提供いただけますと助かります。

    2009年12月1日 9:27