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.
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.
Odpowiedzi:
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.
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.
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.)
Miałem ten sam problem i udało mi się go rozwiązać.
Jeśli masz kontener z DockStyle.Fill
innymi, powinieneś również mieć DockStyle, ale Top lub cokolwiek chcesz.
Ważne jest, aby DockStyle.Fill
najpierw 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.
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;
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.
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.
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)
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).