Panel.Dock Fill ignoruje inne ustawienie Panel.Dock

154

Jeśli utworzysz panel w formularzu i ustawisz go na Dock = Top i upuścisz inny panel i ustawisz jego Dock = Fill, może on wypełnić cały formularz, ignorując pierwszy panel. Zmiana kolejności tabulatorów nic nie robi.

Jeff Cuscutis
źródło

Odpowiedzi:

335

Układ dokowania zależy od kolejności kontrolek rodzeństwa. Kontrolki są zadokowane „za pomocą przycisku w górę”, więc ostatnia kontrolka w kolekcji jest zadokowana jako pierwsza . Zadokowany element sterujący uwzględnia tylko układ wcześniej zadokowanego rodzeństwa. Dlatego formant z Dock = Fill powinien być pierwszy (na górze) w kolejności rodzeństwa, jeśli chcesz, aby wziął pod uwagę inne zadokowane kontrolki. Jeśli nie jest to pierwsza kontrolka, wcześniejsze kontrolki będą na nią nakładać się.

Może to być mylące, ponieważ kolejność rodzeństwa niekoniecznie jest taka sama jak kolejność wizualna, a kolejność rodzeństwa nie zawsze jest widoczna z widoku projektu.

Okno konspektu dokumentu (Widok -> Inne okna -> Konspekt dokumentu) zapewnia przydatny widok drzewa na hierarchię i kolejność formantów oraz umożliwia zmianę kolejności elementów sterujących.

Możesz również zmienić kolejność rodzeństwa bezpośrednio w projektancie za pomocą menu kontekstowego -> Przenieś na przód / Przesuń na spód, co powoduje przeniesienie kontrolki na pierwsze lub ostatnie z rodzeństwa. Te etykiety menu mogą być nieco mylące, ponieważ rzeczywisty efekt zależy od modelu układu.

W przypadku kontrolek o stałej pozycji pozycja 2D jest niezależna od kolejności rodzeństwa, ale gdy kontrolki nakładają się, formant najwcześniej w kolejności będzie „na wierzchu”, ukrywając część rodzeństwa w dalszej kolejności. W tym kontekście Przenieś na wierzch / Przesuń na spód ma sens.

W panelach przepływu lub układu tabeli kolejność tworzenia określa wizualną kolejność formantów. Nie ma nakładających się kontroli. Tak więc przenieś na początek / wyślij do tyłu naprawdę oznacza, że ​​wykonaj pierwszy lub ostatni w kolejności kontroli.

W przypadku zadokowanego układu przenoszenie na wierzch / wysyłanie do tyłu może być jeszcze bardziej zagmatwane, ponieważ określa kolejność obliczania dokowania, więc „przenieś na wierzch” w kontrolce zadokowanej do napełniania umieści formant w środku elementu nadrzędnego , biorąc pod uwagę wszystkie elementy sterujące zadokowane na krawędzi.

JacquesB
źródło
1
mam panel, pasek stanu i pasek menu w formularzu i wydaje się, że kiedy zadokuję pasek menu na górze, pasek stanu na dole i wypełnię panel, panel nie wypełnia przestrzeni między dwa paski, chyba że jest to pierwszy element z rodzeństwa (u góry okna konspektu dokumentu nad dwoma paskami). Przesunięcie panelu w dół (w kierunku „ostatniej”) osłony nad listwami. Czy więc kontrolka Dock = Fill powinna być rzeczywiście pierwszym rodzeństwem w kolejności? Czy źle to czytam? używam 3.5 (2008). Czy to się zmieniło?
jrsconfitto
53
tl; dr; Kliknij prawym przyciskiem myszy panel z Dock = Fill i kliknij „Przesuń na wierzch”.
kristianp
20
+1 do okna konspektu dokumentu. Nigdy nie wiedziałem, że to istnieje, ale jest tak przydatne.
gligoran
2
Jak mogę to zrobić programowo? Mam na myśli, dodam kontrolki dynamicznie, więc nie mogę użyć do tego projektanta.
Camilo Martin,
2
@Camilo: Jeśli dodajesz elementy sterujące dynamicznie, powinieneś dodawać je w żądanej kolejności.
JacquesB,
110

Kliknij prawym przyciskiem myszy panel z Dock = Fill i kliknij „Przesuń na wierzch”.

To sprawia, że ​​ta kontrolka jest tworzona jako ostatnia, co uwzględnia ustawienia Docka w innych kontrolkach w tym samym kontenerze.

Jeff Cuscutis
źródło
1
Proste, na Boże, to naprawdę mnie irytowało
uśmiechnięty mężczyzna
Ma sens, kiedy się nad tym zastanowić.
Gary Kindel
7

Inną, potencjalnie czystszą opcją jest użycie kontrolki TableLayout. Ustaw jeden rząd o żądanej wysokości dla górnej stacji dokującej, a drugi, aby wypełnić w 100% dolną część. Ustaw oba panele w środku na Wypełnienie i gotowe.

(Jednak TableLayout wymaga trochę przyzwyczajenia.)

John Rudy
źródło
1
TableLayout jest również wolniejszy niż dokowanie kontrolerów w celu uzyskania wydajności układu, szczególnie jeśli masz zagnieżdżone kontrolki użytkownika, które używają TableLayout. Jednak daje to ładny układ, aby być pewnym.
Nick
1
Czy ta wydajność uderzyła w coś, co przeciętny użytkownik zobaczy w prostym przypadku dwóch paneli, jak opisano powyżej? Czy może jest to coś, co zauważają, gdy masz dziesiątki UC, wszystkie z układami, wszystko w jednym układzie? (Jak na ironię, aplikacja, nad którą obecnie pracuję, wygląda tak, a wydajność wydaje się OK ...)
John Rudy
TableLayout jest dość lekki. Nie zobaczysz problemów z wydajnością, jeśli tylko rozłożysz kilka elementów sterujących.
Tim
7

Miałem ten sam problem i udało mi się go rozwiązać.
Jeśli masz kontener z DockStyle.Fillinnymi, powinieneś również mieć DockStyle, ale Top lub cokolwiek chcesz.
Ważne jest, aby DockStyle.Fillnajpierw dodać formant z Controls, a następnie innymi.

Przykład:

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

ale jeśli umieścimy cb na pierwszym miejscu

Controls.Add(cb);
Controls.Add(gv); // gv will overlap the combo box.
Pandichie Anton-Valentin
źródło
2

Jeśli nie chcesz zmieniać kolejności elementów wewnątrz kodu, możesz użyć metody Container.Controls.SetChildIndex (), gdzie Container jest np. Form, Panel itp., Do których chcesz dodać kontrolki.

Przykład:

     //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;
Marcus
źródło
1

JacquesB wpadł na pomysł z konspektem dokumentu, ale hierarchia nie rozwiązała mojego problemu. Moje kontrolki nie były w stylu hierarchicznym, były po prostu wymienione z tym samym rodzicem.

Dowiedziałem się, że jeśli zmienisz kolejność, naprawi to tak, jak chcesz.

Elementy sterujące u dołu listy będą nakładać się na elementy sterujące u góry w oknie konspektu dokumentu. W twoim przypadku upewnij się, że pierwszy panel znajduje się poniżej drugiego panelu i tak dalej.

RANONO
źródło
0

Oto sztuczka, która zadziałała dla mnie ..

Umieść element Top i zadokuj go u góry.

Umieść rozdzielacz, a także zadokuj go u góry, a następnie wyłącz go (chyba że chcesz zmienić rozmiar góry).

Następnie umieść obiekt Fill i ustaw Docking na Fill. Obiekt pozostanie poniżej rozdzielacza.

John Christman
źródło
0

Napotkałem ten sam problem. Mój polegał na dodaniu nowych / niestandardowych kontrolek poniżej paska menu w czasie wykonywania. Problem polegał na tym, że kontrolki po zadokowaniu zdecydowały się zadokować od góry formularza i całkowicie ignorowały pasek menu, bardzo denerwujące, jeśli o mnie chodzi. Ponieważ musiało to być wykonywane dynamicznie z kodem, a nie w trybie projektowania, stało się to niezwykle frustrujące. Najprostszym sposobem, jaki znalazłem, jest utworzenie panelu w trybie projektowania i zadokowanie poniżej paska menu. Stamtąd możesz po prostu dodać / usunąć elementy sterujące do panelu i możesz go zadokować w czasie działania. Nie ma potrzeby mieszania wszystkich kontrolek w formularzu, które tak naprawdę nie wymagają zmian, zbyt dużo pracy w zależności od tego, co naprawdę musisz zrobić.

object.dock = Fill
Panel.Controls.Add(object)
Robert S.
źródło
0

Wiem, że to stary post, ale znalazłem coś przydatnego. Aby programowo dostosować kolejność kontroli rodzeństwa dla dynamicznie tworzonych kontroli, możesz zrobić coś takiego:

parentForm.Controls.SetChildIndex (myPanel, 0) 

W moim przypadku zrobiłem to, aby przenieść panel Dock / Fill, aby był pierwszą kontrolką w moim formularzu, aby nie nakładał się na inny zadokowany zestaw kontrolny do Dock / Top (pasek menu).

DrLechter
źródło