[C#] 다른 Panel.Dock 설정을 무시하고 Panel.Dock Fill

양식에서 패널을 작성하여 Dock = Top으로 설정하고 다른 패널을 삭제하고 Dock = Fill로 설정하면 첫 번째 패널을 무시하고 전체 양식을 채울 수 있습니다. 탭 순서를 변경해도 아무런 변화가 없습니다.



답변

도킹 레이아웃 은 형제 제어 순서 에 따라 다릅니다 . 컨트롤은 “버튼 업”으로 도킹되므로 컬렉션의 마지막 컨트롤이 먼저 도킹 됩니다. 도킹 된 컨트롤은 이전에 도킹 된 형제 의 레이아웃 만 고려합니다. 따라서 다른 도킹 된 컨트롤을 고려하려면 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;


답변

JacquesB는 문서 개요에 대한 아이디어를 가지고 있었지만 계층 구조는 내 문제를 해결하지 못했습니다. 내 컨트롤은 계층 구조가 아니기 때문에 동일한 부모와 함께 나열되었습니다.

주문을 변경하면 원하는 방식으로 수정됩니다.

목록 맨 아래에있는 컨트롤은 문서 개요 창에서 맨 위에있는 컨트롤과 겹칩니다. 귀하의 경우 첫 번째 패널이 두 번째 패널 아래에 있는지 확인하십시오.


답변

나를 위해 일한 트릭이 있습니다 ..

상단 항목을 배치하고 상단에 도킹하십시오.

스플리터를 배치하고 상단에 도킹 한 다음 비활성화합니다 (상단의 크기를 조정하지 않는 경우).

그런 다음 채우기 오브젝트를 놓고 도킹을 채우기로 설정하십시오. 개체는 스플리터 아래에 유지됩니다.