フォーム上にパネルを作成し、それをDock = Topに設定して別のパネルをドロップし、そのDock = Fillを設定すると、最初のパネルを無視してフォーム全体を埋めることがあります。タブの順序を変更しても何も起こりません。
フォーム上にパネルを作成し、それをDock = Topに設定して別のパネルをドロップし、そのDock = Fillを設定すると、最初のパネルを無視してフォーム全体を埋めることがあります。タブの順序を変更しても何も起こりません。
回答:
ドッキングレイアウトは、兄弟コントロールの順序によって異なります。コントロールは「ボタンアップ」でドッキングされるため、コレクションの最後のコントロールが最初にドッキングされます。ドッキングされたコントロールは、以前にドッキングされた兄弟のレイアウトのみを考慮します。したがって、他のドッキングされたコントロールを考慮に入れる場合は、Dock = Fillのコントロールが兄弟順で最初(上)になる必要があります。それが最初のコントロールでない場合、以前のコントロールが重複します。
兄弟の順序が必ずしも視覚的な順序と同じであるとは限らず、兄弟の順序がデザインビューから常に明らかであるとは限らないため、これは混乱を招く可能性があります。
[ ドキュメントアウトライン]ウィンドウ([表示]-> [その他のウィンドウ]-> [ドキュメントアウトライン])は、コントロールの階層と順序を示す便利なツリービューを提供し、コントロールの兄弟の順序を変更できます。
コンテキストメニュー-> [最前面へ移動]、[最背面へ移動]を使用して、デザイナーで兄弟の順序を直接変更することもできます。これにより、コントロールが兄弟の最初または最後に移動します。実際の効果はレイアウトモデルに依存するため、これらのメニューラベルは多少混乱する可能性があります。
固定位置のコントロールでは、2Dの位置は兄弟の順序とは関係ありませんが、コントロールが重なっている場合、順序の最も早いコントロールが「上」になり、兄弟の一部が順序の後ろに隠れます。このコンテキストでは、前面に移動/背面に移動するのが理にかなっています。
フローまたはパネルレイアウトパネル内では、作成順序によってコントロールの視覚的な順序が決まります。重複するコントロールはありません。つまり、前面に移動する/背面に移動するということは、コントロールの順序で最初または最後にすることを意味します。
ドッキングされたレイアウトでは、ドッキングが計算される順序が決定されるため、前面に移動/背面に移動するとさらに混乱する可能性があります。そのため、フィルドッキングされたコントロールを「前面に移動」すると、コントロールが親の中央に配置されます。 、すべてのエッジドッキングされたコントロールを考慮に入れます。
Dock = Fillのパネルを右クリックし、「最前面へ」をクリックします。
これにより、このコントロールは最後に作成され、同じコンテナ内の他のコントロールのDock設定が考慮されます。
別の、潜在的によりクリーンなオプションは、TableLayoutコントロールを使用することです。上部のドックに必要な高さの1つの行を設定し、下部に100%を埋める別の行を設定します。内部の両方のパネルを塗りつぶしに設定すれば、完了です。
(ただし、TableLayoutには慣れる必要があります。)
私は同じ問題を抱えていて、なんとか解決しました。
あなたが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.
コード内の要素の順序を変更したくない場合は、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;
ここに私のために働いたトリックがあります。
トップアイテムを配置し、上部にドッキングします。
スプリッターを配置し、上部をドッキングして、無効に設定します(上部のサイズを変更する場合を除く)。
次に、Fillオブジェクトを配置し、ドッキングをFillに設定します。オブジェクトはスプリッターの下にとどまります。
同じ問題が発生しました。私は実行時にメニューストリップの下に新しい/カスタムコントロールを追加しました。問題は、ドッキングされたときのコントロールでした。フォームの上からドッキングし、メニューストリップを完全に無視することにしました。私に尋ねると、非常に迷惑です。これはコードで動的に実行する必要があり、デザインモードでは実行しなかったため、非常にイライラしました。私が見つけた最も簡単な方法は、デザインモード中にパネルを作成し、メニューストリップの下にドッキングすることです。そこから、コントロールをパネルに追加/削除するだけで、実行時にドッキングできます。実際に変更する必要のないフォーム上のすべてのコントロールをいじる必要はありません。実際に何をする必要があるかに応じて、多くの作業が必要です。
object.dock = Fill
Panel.Controls.Add(object)