Panel.Dock Fillは他のPanel.Dock設定を無視します


154

フォーム上にパネルを作成し、それをDock = Topに設定して別のパネルをドロップし、そのDock = Fillを設定すると、最初のパネルを無視してフォーム全体を埋めることがあります。タブの順序を変更しても何も起こりません。

回答:


335

ドッキングレイアウトは、兄弟コントロールの順序によって異なります。コントロールは「ボタンアップ」でドッキングされるため、コレクションの最後のコントロールが最初にドッキングされます。ドッキングされたコントロールは、以前にドッキングされた兄弟のレイアウトのみを考慮します。したがって、他のドッキングされたコントロールを考慮に入れる場合は、Dock = Fillのコントロールが兄弟順で最初(上)になる必要があります。それが最初のコントロールでない場合、以前のコントロールが重複します。

兄弟の順序が必ずしも視覚的な順序と同じであるとは限らず、兄弟の順序がデザインビューから常に明らかであるとは限らないため、これは混乱を招く可能性があります。

[ ドキュメントアウトライン]ウィンドウ([表示]-> [その他のウィンドウ]-> [ドキュメントアウトライン])は、コントロールの階層と順序を示す便利なツリービューを提供し、コントロールの兄弟の順序を変更できます。

コンテキストメニュー-> [最前面へ移動]、[最背面へ移動]を使用して、デザイナーで兄弟の順序を直接変更することもできます。これにより、コントロールが兄弟の最初または最後に移動します。実際の効果はレイアウトモデルに依存するため、これらのメニューラベルは多少混乱する可能性があります。

固定位置のコントロールでは、2Dの位置は兄弟の順序とは関係ありませんが、コントロールが重なっている場合、順序の最も早いコントロールが「上」になり、兄弟の一部が順序の後ろに隠れます。このコンテキストでは、前面に移動/背面に移動するのが理にかなっています。

フローまたはパネルレイアウトパネル内では、作成順序によってコントロールの視覚的な順序が決まります。重複するコントロールはありません。つまり、前面に移動する/背面に移動するということは、コントロールの順序で最初または最後にすることを意味します。

ドッキングされたレイアウトでは、ドッキングが計算される順序が決定されるため、前面に移動/背面に移動するとさらに混乱する可能性があります。そのため、フィルドッキングされたコントロールを「前面に移動」すると、コントロールが親の中央に配置されます。 、すべてのエッジドッキングされたコントロールを考慮に入れます。


1
すべてのフォームにパネル、ステータスストリップ、およびメニューストリップがあり、メニューストリップを上部にドッキングし、ステータスストリップを下部にドッキングして、パネルを埋めると、パネルがその間のスペースを埋めないようです最初の兄弟でない限り、2つのストリップ(2つのストリップの上にある[ドキュメントアウトライン]ウィンドウの上部)。パネルを下に(「最後」に向かって)移動すると、ストリップが覆われます。それでは、Dock = Fillコントロールは実際に順序の最初の兄弟である必要がありますか?私はこれを間違って読んでいますか?3.5(2008)を使用しています。この変更はありましたか?
jrsconfitto 2010

53
tl; dr; Dock = Fillのパネルを右クリックし、「最前面へ」をクリックします。
kristianp '07 / 07/15

20
ドキュメントアウトラインウィンドウの+1。これが存在することを知りませんでしたが、それはとても便利です。
グリゴラン

2
これをプログラムでどのように実行できますか?つまり、コントロールを動的に追加しているため、デザイナーを使用してこれを行うことはできません。
Camilo Martin、

2
@Camilo:コントロールを動的に追加する場合は、必要な順序で追加する必要があります。
JacquesB 2013

110

Dock = Fillのパネルを右クリックし、「最前面へ」をクリックします。

これにより、このコントロールは最後に作成され、同じコンテナ内の他のコントロールのDock設定が考慮されます。


1
シンプル、ゴッドセンド、これは本当に私を悩ませていた
にやにや笑い

あなたがそれについて考えれば、理にかなっています。
ゲイリーキンデル2016

7

別の、潜在的によりクリーンなオプションは、TableLayoutコントロールを使用することです。上部のドックに必要な高さの1つの行を設定し、下部に100%を埋める別の行を設定します。内部の両方のパネルを塗りつぶしに設定すれば、完了です。

(ただし、TableLayoutには慣れる必要があります。)


1
TableLayoutは、特にTableLayoutを使用するネストされたユーザーコントロールがある場合、レイアウトパフォーマンスの制御をドッキングするよりも遅くなります。しかし、それは確かに素晴らしいレイアウトをもたらします。
Nick、

1
このパフォーマンスは、上記のように、2つのパネルの単純なケースで平均的なユーザーが目にするものに影響を与えますか?それとも、すべてが1つのレイアウトで、すべてがレイアウトされた数十のUCを持っているときに彼らが気づくものですか?(皮肉にも、私が現在取り組んでいるアプリはそのようなものであり、パフォーマンスは問題ないようです...)
John Rudy

TableLayoutはかなり軽量です。いくつかのコントロールをレイアウトするだけの場合、パフォーマンスの問題は発生しません。
Tim

7

私は同じ問題を抱えていて、なんとか解決しました。
あなたがDockStyle.Fill他の人と一緒にコンテナを持っている場合は、 DockStyleが必要ですが、Topまたは必要なものは何でも必要です。
重要なことは、DockStyle.Fill最初にコントロールで、次に他のコントロールを追加することです 。

例:

ComboBox cb = new ComboBox();
cb.Dock =  DockStyle.Top;

GridView gv = new GridView();
gv.Dock =  DockStyle.Fill;

Controls.Add(gv); // this is okay
Controls.Add(cb);

しかしcbを最初に置くと

Controls.Add(cb);
Controls.Add(gv); // gv will overlap the combo box.

2

コード内の要素の順序を変更したくない場合は、Container.Controls.SetChildIndex()メソッドを使用して、コントロールを追加したいフォーム、パネルなどのContainerを使用できます。

例:

     //Container ------------------------------------
     Panel Container = new Panel();

     //Top-Docked Element ---------------------------
     ButtonArea = new FlowLayoutPanel();
     Container.Controls.Add(ButtonArea);
     Container.Controls.SetChildIndex(ButtonArea, 1);
     ButtonArea.Dock = DockStyle.Top;

     //Fill-Docked Element --------------------------
     box = new RichTextBox();
     Container.Controls.Add(box);
     Container.Controls.SetChildIndex(box, 0); //setting this to 0 does the trick
     box.Dock = DockStyle.Fill;

1

JacquesBはドキュメントの概要についてアイデアを持っていましたが、階層によって問題が解決しませんでした。私のコントロールは階層的なスタイルではなく、同じ親でリストされていました。

順序を変更すると見た目が修正されることがわかりました。

リストの下部にあるコントロールは、[ドキュメントアウトライン]ウィンドウのリストの上部にあるコントロールと重なります。あなたのケースでは、最初のパネルが2番目のパネルの下にあることを確認します。


0

ここに私のために働いたトリックがあります。

トップアイテムを配置し、上部にドッキングします。

スプリッターを配置し、上部をドッキングして、無効に設定します(上部のサイズを変更する場合を除く)。

次に、Fillオブジェクトを配置し、ドッキングをFillに設定します。オブジェクトはスプリッターの下にとどまります。


0

同じ問題が発生しました。私は実行時にメニューストリップの下に新しい/カスタムコントロールを追加しました。問題は、ドッキングされたときのコントロールでした。フォームの上からドッキングし、メニューストリップを完全に無視することにしました。私に尋ねると、非常に迷惑です。これはコードで動的に実行する必要があり、デザインモードでは実行しなかったため、非常にイライラしました。私が見つけた最も簡単な方法は、デザインモード中にパネルを作成し、メニューストリップの下にドッキングすることです。そこから、コントロールをパネルに追加/削除するだけで、実行時にドッキングできます。実際に変更する必要のないフォーム上のすべてのコントロールをいじる必要はありません。実際に何をする必要があるかに応じて、多くの作業が必要です。

object.dock = Fill
Panel.Controls.Add(object)

0

私はこれが古い記事であることを知っていますが、何か役に立つものを発見しました。動的に作成されたコントロールの兄弟コントロールの順序をプログラムで調整するには、次のようにします。

parentForm.Controls.SetChildIndex (myPanel, 0) 

私の場合、これを行って、Dock / Fillパネルをフォームの最初のコントロールに移動し、Dock / Top(メニューストリップ)に設定された別のドッキングされたコントロールと重ならないようにしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.