5

메뉴 스트립과 여러 패널 컨테이너를 사용하는 Windows 응용 프로그램에서는 메뉴 옵션에 따라 패널이 표시됩니다.Windows 폼에서 모든 패널을 숨기는 방법은 무엇입니까?

수동으로 이름을 전달하여 모든 패널을 숨기는 작업은 시간이 많이 걸리고 모든 패널이나 방법을 숨길 수있는 방법이 있습니까? 양식에있는 모든 패널의 이름을 얻으려면 ??

+0

나는 당신의 제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

+0

[foreach] (http://msdn.microsoft.com/en-us/library/ttw7t8t6(v=80) .aspx) 루프를 사용해 보았습니까? – Brian

답변

8
foreach (Control c in this.Controls) 
{ 
    if (c is Panel) c.Visible = false; 
} 

그리고 당신도 대신 this.Controls을 사용하는 ControlCollection에 그 재귀를 확인하고 전달할 수 :

HidePanels(this.Controls); 

... 

private void HidePanels(ControlCollection controls) 
{ 
    foreach (Control c in controls) 
    { 
     if (c is Panel) 
     { 
      c.Visible = false; 
     } 

     // hide any panels this control may have 
     HidePanels(c.Controls); 
    } 
} 
+0

Ninja'ed. 나는 그 코드를 지금 작성하고 있었다. 그래서 지금 너는 내 upvote 있습니다. – Renan

+0

@Renan, 고마워요, 친구! –

+0

+1 펀치에 나를 때리는 +1 : P – Brian

3

그것이

foreach (Panel p in this.Controls.OfType<Panel>()) { 
    p.Visible = false; 
} 
1

아아 뭔가를 쓸 청소! 나는 코드를 작성하는 중이었습니다! : P 대안으로

Control[] aryControls = new Control[]{ controlnamehere1, controlnamehere2 }; 
foreach (Control ctrl in aryControls) 
{ 
    ctrl.Hide(); 
} 

또는 :

Control[] aryControls = new Control[]{ controlnamehere1, controlnamehere1 }; 
foreach (Control ctrl in aryControls) 
{ 
    ctrl.Visible = false; 
} 
+0

컨트롤에 panel1, button1이 있다는 것을 어떻게 알 수 있습니까? 왜 새로운 Control [] 배열을 만들고, 그 메모리는 효과가 없습니까? 불필요하게 메모리를 낭비하는 등의 나쁜 습관을 배우려고하십니까? –

+0

더 명확하게 편집되었습니다. 이제 내 대답을보고 snarky가되고 있니? – Brian

5

그래서 아마도 당신은뿐만 아니라 최고 수준의 제어, 어디 폼의 모든 컨트롤을 싶어. 이를 위해 우리는 특정 제어를 위해, 모든 수준에서, 모든 자식 컨트롤을 얻기 위해이 편리한 작은 도우미 함수가 필요합니다 : 당신은 당신이 그것을 사용하는 거라고 생각한다면

public static IEnumerable<Control> GetAllControls(Control control) 
{ 
    Stack<Control> stack = new Stack<Control>(); 
    stack.Push(control); 

    while (stack.Any()) 
    { 
     var next = stack.Pop(); 
     yield return next; 
     foreach (Control child in next.Controls) 
     { 
      stack.Push(child); 
     } 
    } 
} 

(그것을 확장 방법을 자유롭게 충분히)

그리고 우리가 특정 유형의 컨트롤을 얻기 위해 그 결과에 OfType를 사용할 수는 :.

var panels = GetAllControls(this).OfType<Panel>(); 
+0

재귀보다 루프를 사용하는 좋은 방법 (잠재적 인 스택 오버플로를 피할 수 있습니다. 그러나 컨트롤 계층을 깊이 관리 할 수 ​​있다면 아마도 뒤로 물러나서 숨을 쉬어야합니다 ...)! 제네릭으로 형식을 사용하고 요청한 형식을 스택에 일치시킨 컨트롤 만 밀어 넣은 경우 조금 더 좋을 수 있다고 생각합니다. 어쩌면 그것은 필요하지 않을지도 모르지만 .... – Joshua

+0

@Joshua 그건 효과가 없을거야. 거기에 패널이있는 최상위 수준에 사용자 정의 컨트롤이 있으면 어떻게 될까요? 그 패널을 원해? 그렇게 할 경우, 찾고있는 패널을 즉시 필터링 할 수 없기 때문에 마지막에해야합니다.물론 컨트롤과 그 부모 모두가 지정된 타입의 * all *이 아니면 컨트롤을 반환하고 싶지 않으면 다른 이야기입니다. 그것은 확실히 더 빠를 것입니다 (당신은 훨씬 적은 컨트롤을 보입니다). 그러나 결과 측면에서도 매우 다릅니다. – Servy

+0

@Joshua 또한 재귀를 피하면 SO 예외를 방지 할 수있을뿐 아니라 일반적으로 성능이 향상됩니다. 엄청난 차이가 아니라 어느 정도는 그렇습니다. 또한 디버깅이나 예외 처리시 지저분한 스택 추적을 방지합니다. – Servy