wake-up-neo.com

Panel.Dock Fill ignoriert andere Panel.Dock-Einstellungen

Wenn Sie ein Panel in einem Formular erstellen und auf Dock = Oben klicken und ein anderes Panel ablegen und Dock = Füllen festlegen, wird möglicherweise das gesamte Formular ausgefüllt, wobei das erste Panel ignoriert wird. Das Ändern der Tabulatorreihenfolge bewirkt nichts.

134
Jeff Cuscutis

Das Docking-Layout hängt von der Reihenfolge der Steuerelemente der Geschwister ab. Die Steuerelemente sind "auf Knopfdruck" angedockt, sodass das letzte Steuerelement in der Sammlung zuerst angedockt wird. Ein angedocktes Steuerelement berücksichtigt nur das Layout von zuvor angedockten Geschwistern . Daher sollte das Steuerelement mit Dock = Fill in der Reihenfolge der Geschwister an erster Stelle (oben) stehen, wenn die anderen angedockten Steuerelemente berücksichtigt werden sollen. Wenn es nicht das erste Steuerelement ist, überlappen es frühere Steuerelemente.

Dies kann verwirrend sein, da die Reihenfolge der Geschwister nicht unbedingt mit der visuellen Reihenfolge übereinstimmt und die Reihenfolge der Geschwister aus der Entwurfsansicht nicht immer ersichtlich ist.

Das Fenster Dokumentgliederung (Ansicht -> Andere Fenster -> Dokumentgliederung) bietet eine nützliche Strukturansicht über die Steuerelementhierarchie und -reihenfolge und ermöglicht es Ihnen, die Reihenfolge der Geschwister der Steuerelemente zu ändern.

Sie können die Reihenfolge der Geschwister auch direkt im Designer über das Kontextmenü ändern -> Nach vorne bringen/Nach hinten senden, wodurch das Steuerelement als erstes oder letztes der Geschwister angezeigt wird. Diese Menübeschriftungen können etwas verwirrend sein, da der tatsächliche Effekt vom Layoutmodell abhängt.

Bei fest positionierten Steuerelementen ist die 2D-Position unabhängig von der Reihenfolge der Geschwister. Wenn sich die Steuerelemente jedoch überlappen, befindet sich das früheste Steuerelement in der Reihenfolge "oben" und versteckt einen Teil der Geschwister später in der Reihenfolge. In diesem Zusammenhang ist Nach vorne bringen/Nach hinten senden sinnvoll.

In Flow- oder Table-Layout-Fenstern bestimmt die Erstellungsreihenfolge die visuelle Reihenfolge der Steuerelemente. Es gibt keine überlappenden Steuerelemente. Nach vorne bringen/nach hinten senden heißt also, zuerst oder zuletzt in der Reihenfolge der Kontrollen zu machen.

Bei angedocktem Layout ist das Bringen nach vorne/Senden nach hinten möglicherweise noch verwirrender, da es bestimmt, in welcher Reihenfolge das Andocken berechnet wird. "Nach vorne bringen" in einem angedockten Steuerelement platziert das Steuerelement in Mitte des übergeordneten Elements unter Berücksichtigung aller angedockten Steuerelemente.

311
JacquesB

Klicken Sie mit der rechten Maustaste auf das Panel mit Dock = Fill und klicken Sie auf "In den Vordergrund". 

Dadurch wird dieses Steuerelement zuletzt erstellt, wodurch die Dock-Einstellungen für andere Steuerelemente in demselben Container berücksichtigt werden.

97
Jeff Cuscutis

Eine andere, möglicherweise sauberere Option ist die Verwendung des TableLayout-Steuerelements. Richten Sie eine Reihe der gewünschten Höhe für Ihr oberes Dock und eine weitere Reihe so ein, dass sie 100% für Ihre Unterseite ausfüllt. Stellen Sie beide Bereiche auf "Füllen", und Sie sind fertig.

(TableLayout ist allerdings gewöhnungsbedürftig.)

7
John Rudy

Ich hatte das gleiche Problem und konnte es lösen.
Wenn Sie einen Container mit DockStyle.Fill haben, sollten die anderen auch DockStyle haben, aber Top oder was immer Sie möchten.
Das Wichtigste ist, das Steuerelement mit DockStyle.Fill zuerst in Steuerelemente und dann mit den anderen hinzuzufügen.

Beispiel:

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);

aber wenn wir Cb zuerst setzen

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

Wenn Sie die Reihenfolge der Elemente im Code nicht ändern möchten, können Sie die Methode Container.Controls.SetChildIndex () verwenden. Formular, Panel usw., zu dem Sie Ihre Steuerelemente hinzufügen möchten.

Beispiel:

     //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
Marcus

JacquesB hatte die Idee mit der Umrisslinie des Dokuments, aber die Hierarchie löste mein Problem nicht. Meine Steuerelemente waren nicht in einem hierarchischen Stil, sie wurden nur mit demselben übergeordneten Element aufgelistet.

Ich habe gelernt, dass, wenn Sie die Reihenfolge geändert haben, die Art und Weise festgelegt wird, wie Sie möchten.

Die Steuerelemente am unteren Rand der Liste überlappen die Steuerelemente darüber im Fenster Dokumentgliederung. In Ihrem Fall würden Sie sicherstellen, dass sich das erste Feld unter dem zweiten Feld befindet und so weiter.

1
RANONO

Ich bin auf die gleiche Ausgabe gestoßen. Meines war das Hinzufügen neuer/benutzerdefinierter Steuerelemente zur Laufzeit unterhalb der Menüleiste. Das Problem war die Steuerung, wenn sie angedockt war, entschied sich, an der Spitze des Formulars anzudocken und die Menüleiste vollständig zu ignorieren, was sehr ärgerlich ist, wenn Sie mich fragen wurde extrem frustrierend. Der einfachste Weg, den ich gefunden habe, ist das Erstellen eines Bedienfelds im Entwurfsmodus und das Andocken unter der Menüleiste. Von dort aus können Sie einfach die Steuerelemente zum Panel hinzufügen/entfernen und es zur Laufzeit andocken. Sie müssen sich nicht mit all Ihren Steuerelementen in Ihrem Formular herumschlagen, die nicht wirklich geändert werden müssen. Zu viel Arbeit, je nachdem, was Sie wirklich tun müssen.

object.dock = Fill
Panel.Controls.Add(object)
0
Robert S.

Hier ist ein Trick, der für mich funktioniert hat ..

Platzieren Sie den obersten Artikel und docken Sie ihn oben an.

Platzieren Sie einen Splitter und docken Sie ihn auch oben an, und setzen Sie ihn inaktiv (es sei denn, Sie möchten die Größe der Oberseite ändern).

Platzieren Sie dann das Fill-Objekt und setzen Sie Docking auf Fill. Das Objekt bleibt unter dem Splitter.

0
John Christman

Ich weiß, dass dies ein alter Beitrag ist, aber ich habe etwas Nützliches entdeckt. Um die Reihenfolge der Geschwistersteuerelemente für dynamisch erstellte Steuerelemente programmgesteuert anzupassen, können Sie folgende Aktionen ausführen:

parentForm.Controls.SetChildIndex (myPanel, 0) 

In meinem Fall habe ich dies getan, um ein Dock/Fill-Bedienfeld als erstes Steuerelement in meinem Formular zu verschieben, damit es sich nicht mit einem anderen angedockten Steuerelement überlappt, das auf Dock/Top (eine Menüleiste) festgelegt ist.

0
DrLechter