Panel.Wypełnienie doku ignoruje inny Panel.Ustawienie stacji dokującej

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

Author: Mihai Limbășan, 2008-09-30

8 answers

Układ dokowania zależy od kolejności kontrolek rodzeństwa. Kontrolki są zadokowane "przyciskiem", więc ostatnia kontrolka w kolekcji jest zadokowana jako pierwsza. Zadokowana Kontrola uwzględnia tylko układ poprzednio zadokowanego rodzeństwa. Dlatego kontrolka z Dock = Fill powinna być pierwsza (góra) w kolejności rodzeństwa, jeśli chcesz, aby wzięła pod uwagę inne zadokowane kontrolki. Jeśli nie jest to pierwsza kontrolka, wcześniejsze kontrolki nakładają się na nią.

To może być mylące ponieważ porządek rodzeństwa niekoniecznie jest taki sam jak porządek wizualny, a porządek rodzeństwa nie zawsze jest widoczny z widoku projektu.

Okno obrys dokumentu (widok -> inne okna -> obrys dokumentu) daje użyteczny widok drzewa nad hierarchią i porządkiem sterowania oraz pozwala zmienić kolejność kontrolek.

Możesz również zmienić kolejność rodzeństwa bezpośrednio w menu kontekstowym designer by - > Bring to front / Send to back, co przesuwa kontrolkę być pierwszym lub ostatnim z rodzeństwa. Te etykiety menu mogą być nieco mylące, ponieważ rzeczywisty efekt zależy od modelu układu.

Ze stałymi elementami sterującymi, pozycja 2D jest niezależna od kolejności rodzeństwa, ale gdy elementy sterujące nakładają się na siebie, kontrolka najwcześniej w kolejności będzie "na górze", ukrywając część rodzeństwa później w kolejności. W tym kontekście Bring to front / Send to back ma sens.

Wewnątrz paneli flow-lub table-layout, kolejność tworzenia określa wizualna kolejność elementów sterujących. Nie ma nakładających się kontrolek. Tak więc bring to front/send to back naprawdę oznacza zrobić pierwszy lub ostatni w kolejności kontroli.

Przy zadokowanym układzie, funkcja "bring to front" / "send to back" może być jeszcze bardziej myląca, ponieważ określa kolejność, w jakiej dokowanie jest obliczane, więc "bring to front" na zadokowanym elemencie sterującym umieści kontrolkę w środku rodzica, biorąc pod uwagę wszystkie zadokowane elementy sterujące.

 287
Author: JacquesB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-24 15:26:57

Kliknij prawym przyciskiem myszy na panelu z Dock=Fill i kliknij "Bring to Front".

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

 93
Author: Jeff Cuscutis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-30 19:23:32

Inną, potencjalnie czystszą opcją jest użycie kontrolki TableLayout. Ustaw jeden wiersz żądanej wysokości dla górnego doku, a drugi wiersz, aby wypełnić 100% dla dolnego. Ustaw oba panele do wypełnienia i gotowe.

(TableLayout trzeba się jednak przyzwyczaić.)

 7
Author: John Rudy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-30 19:36:13

Miałem ten sam problem i udało mi się go rozwiązać.
Jeśli masz kontener z DockStyle.Fill, pozostałe powinny mieć również DockStyle, ale Top lub cokolwiek chcesz.
Ważne jest, aby dodać kontrolkę DockStyle.Fill najpierw w kontrolkach, a następnie w pozostałych.

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 postawimy cb na pierwszym miejscu

Controls.Add(cb);
Controls.Add(gv); // gv will overlap the combo box.
 6
Author: Pandichie Anton-Valentin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-25 11:54:15

JacquesB wpadł na pomysł z zarysem 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ść, to poprawi to, jak chcesz, aby wyglądała.

Elementy sterujące na dole listy nakładają się na elementy sterujące na górze w oknie obrysu dokumentu. W Twoim przypadku upewnij się, że pierwszy panel znajduje się poniżej drugiego panelu i tak naprzód.

 1
Author: RANONO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-07 20:44:54

Jeśli nie chcesz zmieniać kolejności elementów w kodzie, możesz użyć metody Container.Sterowanie.SetChildIndex () z kontenerem będącym np. formularzem, panelem itp. chcesz dodać kontrolki do.

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;
 1
Author: Marcus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-10 09:23:22

Oto sztuczka, która mi pomogła..

Umieść górny element i zadokuj go na górze.

Umieść Splitter, a także zadokuj go na górze, a następnie Ustaw wyłączony (chyba że chcesz zmienić rozmiar góry).

Następnie umieść obiekt wypełnienia i ustaw dokowanie do wypełnienia. Obiekt pozostanie poniżej rozdzielacza.

 0
Author: John Christman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-01 20:56:08

Natknąłem się na ten sam problem. Mój polegał na dodaniu nowych / niestandardowych kontrolek pod paskiem menu w czasie wykonywania. Problemem było sterowanie po zadokowaniu, postanowił zadokować z góry formularza i całkowicie ignorując pasek menu całkowicie, bardzo denerwujące, jeśli mnie pytasz. Ponieważ należało to robić 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 dokowanie pod paskiem menu. Stamtąd ty można po prostu dodać / usunąć elementy sterujące do panelu i można go zadokować w czasie wykonywania. Nie musisz mieszać ze wszystkimi kontrolkami w formularzu, które tak naprawdę nie muszą się zmieniać, zbyt wiele pracy w zależności od tego, co naprawdę musisz zrobić.

object.dock = Fill
Panel.Controls.Add(object)
 0
Author: Robert S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 14:10:12