다른 Panel.Dock 설정을 무시하고 Panel.Dock Fill


154

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

답변:


335

도킹 레이아웃 은 형제 제어 순서 에 따라 다릅니다 . 컨트롤은 "버튼 업"으로 도킹되므로 컬렉션의 마지막 컨트롤이 먼저 도킹 됩니다. 도킹 된 컨트롤은 이전에 도킹 된 형제 의 레이아웃 만 고려합니다. 따라서 다른 도킹 된 컨트롤을 고려하려면 Dock = Fill 컨트롤이 형제 순서에서 맨 위에 있어야합니다. 첫 번째 컨트롤이 아닌 경우 이전 컨트롤이 겹칩니다.

형제 순서가 반드시 시각적 순서와 같을 필요는없고 형제 순서가 항상 설계 뷰에서 명확하지 않기 때문에 혼동 될 수 있습니다.

문서 개요 창 (보기 -> 다른 윈도우 -> 문서 개요) 컨트롤 계층 구조와 질서를 통해 유용한 트리보기를 제공하고, 당신이 컨트롤의 형제의 순서를 변경할 수 있습니다.

컨텍스트 메뉴-> 맨 앞으로 가져 오기 / 뒤로 보내기를 통해 디자이너에서 직접 형제 순서를 변경할 수 있습니다. 그러면 컨트롤이 형제의 첫 번째 또는 마지막으로 이동합니다. 실제 효과는 레이아웃 모델에 따라 다르므로 이러한 메뉴 레이블은 다소 혼란 스러울 수 있습니다.

고정 위치 컨트롤을 사용하면 2D 위치는 형제 순서와 무관하지만 컨트롤이 겹치면 순서에서 가장 이른 컨트롤이 "맨 위"가되어 나중에 형제 순서의 일부를 숨 깁니다. 이와 관련하여 앞으로 가져 오기 / 뒤로 보내기가 의미가 있습니다.

흐름 또는 테이블 레이아웃 패널 내에서 생성 순서에 따라 컨트롤의 시각적 순서가 결정됩니다. 겹치는 컨트롤이 없습니다. 따라서 앞 / 뒤로 가져 오기는 실제로 제어 순서대로 첫 번째 또는 마지막을 만드는 것을 의미합니다.

도킹 된 레이아웃을 사용하면 도킹 계산 순서를 결정하기 때문에 앞뒤로 가져 오기 / 뒤로 보내기가 더 혼란 스러울 수 있습니다. 따라서 도킹 ​​된 도킹 된 컨트롤의 "앞으로 가져 오기"는 컨트롤을 부모 중앙 에 배치합니다. 엣지 도킹 된 모든 컨트롤을 고려합니다.


1
패널, 상태 스트립 및 메뉴 스트립이 모두 양식에 있고 메뉴 스트립을 맨 위에 고정하고 상태 스트립을 맨 아래에 고정하고 패널을 채울 때 패널이 사이의 공간을 채우지 않는 것 같습니다 첫 번째 형제가 아닌 경우 두 개의 스트립 (두 개의 스트립 위의 문서 개요 창의 맨 위에 있음). 패널을 아래로 움직이면 ( "마지막"쪽으로) 스트립 위로 덮습니다. 따라서 Dock = Fill 컨트롤이 실제로 첫 번째 형제 여야합니까? 내가 이것을 잘못 읽고 있습니까? 3.5 (2008)를 사용하고 있습니다. 이 변경 되었습니까?
jrsconfitto

53
tl; dr; Dock = Fill이있는 패널을 마우스 오른쪽 버튼으로 클릭하고 'Bring to Front'를 클릭하십시오.
kristianp

20
문서 개요 창 +1 이것이 존재한다는 것을 알지 못했지만 매우 유용합니다.
gligoran

2
프로그래밍 방식으로 어떻게 할 수 있습니까? 내 말은, 컨트롤을 동적으로 추가하고 있으므로 디자이너를 사용 하여이 작업을 수행 할 수 없습니다.
Camilo Martin

2
@Camilo : 컨트롤을 동적으로 추가하는 경우 원하는 순서대로 추가해야합니다.
JacquesB

110

Dock = Fill이있는 패널을 마우스 오른쪽 버튼으로 클릭하고 'Bring to Front'를 클릭하십시오.

이렇게하면이 컨트롤이 마지막에 만들어져 동일한 컨테이너에있는 다른 컨트롤의 Dock 설정을 고려합니다.


1
간단하고, Godsend, 이것은 정말로 나를 귀찮게했다
smirkingman

일단 생각하면 말이됩니다.
게리 킨델

7

또 다른 확실한 옵션은 TableLayout 컨트롤을 사용하는 것입니다. 상단 도크에 원하는 높이의 한 행을 설정하고 하단에 100 %를 채우도록 다른 행을 설정하십시오. 두 패널을 모두 채우기로 설정하면 완료됩니다.

(TableLayout은 익숙해지기까지 다소 시간이 걸립니다.)


1
TableLayout은 특히 TableLayout을 사용하는 중첩 된 사용자 정의 컨트롤이있는 경우 레이아웃 성능면에서 도킹 Conterol보다 느립니다. 그러나 확실하게 멋진 레이아웃을 생성합니다.
Nick

1
이 성능은 위에서 설명한 것처럼 일반 사용자가 두 패널의 간단한 경우에 볼 수있는 것입니까? 아니면 레이아웃이있는 수십 개의 UC가 모두 하나의 레이아웃에있을 때 알아 채는 것입니까? (아이러니하게도, ... 내가 현재 일하고 있어요 응용 프로그램은 그렇게이며, 성능 확인을 보인다)
존 루디

TableLayout은 매우 가볍습니다. 몇 가지 컨트롤 만 배치하면 성능 문제가 표시되지 않습니다.
Tim

7

나는 같은 문제가 있었고 그것을 해결했다. 다른
컨테이너가 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.

2

코드 내부의 요소 순서를 변경하지 않으려면 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;

1

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

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

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


0

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

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

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

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


0

나는 같은 문제에 부딪쳤다. 광산은 런타임 동안 메뉴 스트립 아래에 새로운 / 사용자 정의 컨트롤을 추가했습니다. 문제는 도킹 할 때 컨트롤이었고 폼의 상단에서 도킹하기로 결정하고 메뉴 스트립을 완전히 무시하기로 결정했습니다. 이것은 디자인 모드가 아닌 코드를 사용하여 동적으로 수행해야하므로 매우 실망 스러웠습니다. 내가 찾은 가장 간단한 방법은 디자인 모드에서 패널을 만들고 메뉴 스트립 아래에 도킹하는 것입니다. 여기에서 컨트롤을 패널에 추가 / 제거하고 런타임 중에 도킹 할 수 있습니다. 실제로 변경할 필요가없는 양식의 모든 컨트롤을 망칠 필요가 없으며 실제로해야 할 일에 따라 너무 많은 작업이 필요합니다.

object.dock = Fill
Panel.Controls.Add(object)

0

나는 이것이 오래된 게시물이라는 것을 알고 있지만 유용한 것을 발견했습니다. 동적으로 생성 된 컨트롤에 대해 형제 제어 순서를 프로그래밍 방식으로 조정하려면 다음과 같이 할 수 있습니다.

parentForm.Controls.SetChildIndex (myPanel, 0) 

필자의 경우 Dock / Fill 패널을 내 양식의 첫 번째 컨트롤로 이동하여 Dock / Top (메뉴 스트립)으로 설정된 다른 도킹 된 컨트롤과 겹치지 않도록했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.