답변:
도킹 레이아웃 은 형제 제어 순서 에 따라 다릅니다 . 컨트롤은 "버튼 업"으로 도킹되므로 컬렉션의 마지막 컨트롤이 먼저 도킹 됩니다. 도킹 된 컨트롤은 이전에 도킹 된 형제 의 레이아웃 만 고려합니다. 따라서 다른 도킹 된 컨트롤을 고려하려면 Dock = Fill 컨트롤이 형제 순서에서 맨 위에 있어야합니다. 첫 번째 컨트롤이 아닌 경우 이전 컨트롤이 겹칩니다.
형제 순서가 반드시 시각적 순서와 같을 필요는없고 형제 순서가 항상 설계 뷰에서 명확하지 않기 때문에 혼동 될 수 있습니다.
문서 개요 창 (보기 -> 다른 윈도우 -> 문서 개요) 컨트롤 계층 구조와 질서를 통해 유용한 트리보기를 제공하고, 당신이 컨트롤의 형제의 순서를 변경할 수 있습니다.
컨텍스트 메뉴-> 맨 앞으로 가져 오기 / 뒤로 보내기를 통해 디자이너에서 직접 형제 순서를 변경할 수 있습니다. 그러면 컨트롤이 형제의 첫 번째 또는 마지막으로 이동합니다. 실제 효과는 레이아웃 모델에 따라 다르므로 이러한 메뉴 레이블은 다소 혼란 스러울 수 있습니다.
고정 위치 컨트롤을 사용하면 2D 위치는 형제 순서와 무관하지만 컨트롤이 겹치면 순서에서 가장 이른 컨트롤이 "맨 위"가되어 나중에 형제 순서의 일부를 숨 깁니다. 이와 관련하여 앞으로 가져 오기 / 뒤로 보내기가 의미가 있습니다.
흐름 또는 테이블 레이아웃 패널 내에서 생성 순서에 따라 컨트롤의 시각적 순서가 결정됩니다. 겹치는 컨트롤이 없습니다. 따라서 앞 / 뒤로 가져 오기는 실제로 제어 순서대로 첫 번째 또는 마지막을 만드는 것을 의미합니다.
도킹 된 레이아웃을 사용하면 도킹 계산 순서를 결정하기 때문에 앞뒤로 가져 오기 / 뒤로 보내기가 더 혼란 스러울 수 있습니다. 따라서 도킹 된 도킹 된 컨트롤의 "앞으로 가져 오기"는 컨트롤을 부모 중앙 에 배치합니다. 엣지 도킹 된 모든 컨트롤을 고려합니다.
Dock = Fill이있는 패널을 마우스 오른쪽 버튼으로 클릭하고 'Bring to Front'를 클릭하십시오.
이렇게하면이 컨트롤이 마지막에 만들어져 동일한 컨테이너에있는 다른 컨트롤의 Dock 설정을 고려합니다.
또 다른 확실한 옵션은 TableLayout 컨트롤을 사용하는 것입니다. 상단 도크에 원하는 높이의 한 행을 설정하고 하단에 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 ------------------------------------
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;
나는 같은 문제에 부딪쳤다. 광산은 런타임 동안 메뉴 스트립 아래에 새로운 / 사용자 정의 컨트롤을 추가했습니다. 문제는 도킹 할 때 컨트롤이었고 폼의 상단에서 도킹하기로 결정하고 메뉴 스트립을 완전히 무시하기로 결정했습니다. 이것은 디자인 모드가 아닌 코드를 사용하여 동적으로 수행해야하므로 매우 실망 스러웠습니다. 내가 찾은 가장 간단한 방법은 디자인 모드에서 패널을 만들고 메뉴 스트립 아래에 도킹하는 것입니다. 여기에서 컨트롤을 패널에 추가 / 제거하고 런타임 중에 도킹 할 수 있습니다. 실제로 변경할 필요가없는 양식의 모든 컨트롤을 망칠 필요가 없으며 실제로해야 할 일에 따라 너무 많은 작업이 필요합니다.
object.dock = Fill
Panel.Controls.Add(object)