トップ回答者
TabControlを自作するには(ListBox+Panelなど)

質問
-
ダイアログで1シートを越える内容を複数のシートに分けてページを切り替えるのには、通常TabControlを使用すると思います。
しかし最近、左側にListBoxやTreeViewを配置してこちらでページをめくり、右半分の領域を切り替えるタイプのダイアログが多く設計されています。
これをSystem.Windows.Formsで作成するにはListBox+Panelという構成になるかと思いますが、何か参考になるようなオープンソースのプロダクトや、ライブラリ化されたものなどはございませんでしょうか?
ちなみに右側にTabControlを配置することで楽をできないかと考えたのですが、残念ながらTabControlのタブだけを非表示にすることはできないようで断念したところです。
回答
-
ベタにやるなら、1ページごとに UserControl として別途画面を作ったり、コーディングしたりしておき、すべてのページをフォーム側では同じ座標に配置する。
表示中のページ以外を担当するコントロールは非表示にしておき、ListBox や TreeView の選択状態次第で、表示状態を制御するってところでしょうか。
Tab のない、TabControl も頑張れば自作できると思いますが、結構大変かもしれません。
(本気でやるなら、デザイナに対するサポート機能を実装する必要が出てくる)
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク kanryu 2009年12月1日 9:24
すべての返信
-
ベタにやるなら、1ページごとに UserControl として別途画面を作ったり、コーディングしたりしておき、すべてのページをフォーム側では同じ座標に配置する。
表示中のページ以外を担当するコントロールは非表示にしておき、ListBox や TreeView の選択状態次第で、表示状態を制御するってところでしょうか。
Tab のない、TabControl も頑張れば自作できると思いますが、結構大変かもしれません。
(本気でやるなら、デザイナに対するサポート機能を実装する必要が出てくる)
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク kanryu 2009年12月1日 9:24
-
ベタにやるなら、1ページごとに UserControl として別途画面を作ったり、コーディングしたりしておき、すべてのページをフォーム側では同じ座標に配置する。
何もないところから普通に作っていくとすれば、やはりそんな感じになるでしょうか。
表示中のページ以外を担当するコントロールは非表示にしておき、ListBox や TreeView の選択状態次第で、表示状態を制御するってところでしょうか。
Tab のない、TabControl も頑張れば自作できると思いますが、結構大変かもしれません。
(本気でやるなら、デザイナに対するサポート機能を実装する必要が出てくる)
UserControlで作成すると各シートごとに別クラスになり、サイズを合わせるのが面倒くさいのが難点ですね。
とはいえ1シートに表示しきれないから複数のシートに分けるわけで、全部1個のクラスで管理したらコントロールのメンバがすごい数になってしまって管理が大変かもしれません。従って、悪くない方策なのかもしれないですね。
PanelにUserControlを貼り付けると、親フォームで用意した枠より大きなシートを表示すると自動的にスクロールバーが表示されるので、かなりいい感じです。
そしてプロパティーシートのごとく、親のフォームを単独で実装できるのもいいところですね。
あと、これだけ多くの情報をアプリ本体とやり取りするのはどういう形が考えられるでしょうか。
一般的にはアプリケーションの設定ファイルとそのインターフェイスとなるデザイナが生成するstaticクラスを介することになるでしょうか。
今回の場合、各シートと親ダイアログとアプリケーション本体との間で情報の更新を行っていく必要があり、配慮しないといけないことが多くなりそうです。 -
今回の場合、各シートと親ダイアログとアプリケーション本体との間で情報の更新を行っていく必要があり、配慮しないといけないことが多くなりそうです。
理想を言えば、下記のようなイメージです。
現在の設定値を画面に表示する
→フォーム側からユーザコントロールのプロパティに設定する。
画面から設定値を取得する
→フォーム側からユーザコントロールのプロパティを取得・収集する。
画面での変更操作を受けて何か動かす
→ユーザコントロールにイベントを用意・公開し、フォーム側からはイベントハンドラを登録する。
# あくまで理想です。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。 -
ベタにやるなら、1ページごとに UserControl として別途画面を作ったり、コーディングしたりしておき、すべてのページをフォーム側では同じ座標に配置する。
トピックを投稿した段階の予想を超える回答ではなかったものの、特に問題なく実装できていますので
表示中のページ以外を担当するコントロールは非表示にしておき、ListBox や TreeView の選択状態次第で、表示状態を制御するってところでしょうか。
Tab のない、TabControl も頑張れば自作できると思いますが、結構大変かもしれません。
(本気でやるなら、デザイナに対するサポート機能を実装する必要が出てくる)
ひとまずこのトピックの回答とさせていただきます。
※Page(UserControl)のサイズを変更すると、親フォームでデザイナーが勝手にサイズを指定してしまってる関係で大きさが狂ってしまうことがありますね。手動で削除するか、AutoSize = True;にする必要があるようです。
よりエレガントな実装法などをご存知でしたら、引き続き情報を提供いただけますと助かります。