2012-11-19 3 views
9

내 양식에는 메뉴, 패널, 스플리터, 레이블, 텍스트 상자 등 수백 가지 컨트롤이 있습니다. 이름을 지정하십시오.단추를 제외하고 양식의 모든 컨트롤을 사용하지 않도록 설정하는 방법은 무엇입니까?

하나의 버튼을 제외한 모든 컨트롤을 비활성화하는 방법이 있습니까?

버튼이 중요한 이유는 하나의 컨트롤이 여전히 사용 가능해야하기 때문에 창이나 무언가를 비활성화하는 메서드를 사용할 수 없기 때문입니다.

+1

버튼을 별도의 양식으로 넣으시겠습니까? – SLaks

+0

각 폼의 Enabled 속성을 설정하여 폼의 모든 컨트롤을 루프 할 수 없습니까? 루프에서 ID/이름을 사용하여 단추를 무시하십시오. 또는 루프에서 모든 것을 비활성화 한 다음 바로 버튼을 활성화하십시오. –

답변

21

관련된 모든 컨트롤을 사용하지 않도록 재귀 호출을 수행 할 수 있습니다. 그런 다음 버튼과 상위 컨테이너를 활성화해야합니다. 유지 관리가 쉬운 것입니다 더 나은, 더 우아한 솔루션에 대한

private void Form1_Load(object sender, EventArgs e) { 
     DisableControls(this); 
     EnableControls(Button1); 
    } 

    private void DisableControls(Control con) { 
     foreach (Control c in con.Controls) { 
      DisableControls(c); 
     } 
     con.Enabled = false; 
    } 

    private void EnableControls(Control con) { 
     if (con != null) { 
      con.Enabled = true; 
      EnableControls(con.Parent); 
     } 
    } 
+1

왜 ref 키워드를 포함 시키시겠습니까? –

+0

나는 그렇지 않다. 그것을 타이핑하는 동안 나는 전화를하고 있었고 어떤 이유로 든 방금 나온 것이었다 – pinkfloydx33

+0

하. 잘 했어. 나는 당신이 방법을 알지 못하게 만들었거나 특정 컨트롤에 관심을 갖지 않는 것을 좋아합니다. 초보자는 그런 것을 간과합니다. –

8

- 당신은 아마 다른 컨트롤을 제외하고 당신의 버튼을 넣어 같은 당신의 디자인을 재고 할 필요가있다. 그런 다음 다른 컨트롤이 패널 또는 그룹 상자에 있다고 가정하면 Panel.Enabled = False을 수행하면됩니다. @ pinkfloydx33의 대답은 내가 그것을 만든 편집을 바탕으로

Array.ForEach(Me.Controls.GetAllControlsOfType(Of Control), Sub(x As Control) x.Enabled = False) 
yourButton.Enabled = True 
+1

+1 디자인을 다시 언급하는 것에 대해 +1합니다. –

+0

+1'Panel.Enabled = false | true'에 +1. 인터페이스를 재 설계하여 컨트롤 그룹을 만든 다음 전체 그룹을 비활성화하면 반드시 UI를 디자인하는 더 좋은 방법입니다. – sentenza

10

, 나는 연장을 만든 : 당신이 정말로 당신의 현재 디자인을 유지하려면

, 당신은 Linearise ControlCollection tree into array of Control 다음 다음 않는 재귀를 방지 할 수 있습니다 더욱 쉽게 만드는 방법은 그냥이 같은 public static class를 만듭니다

public static class GuiExtensionMethods 
{ 
     public static void Enable(this Control con, bool enable) 
     { 
      if (con != null) 
      { 
       foreach (Control c in con.Controls) 
       { 
        c.Enable(enable); 
       } 

       try 
       { 
        con.Invoke((MethodInvoker)(() => con.Enabled = enable)); 
       } 
       catch 
       { 
       } 
      } 
     } 
} 

을 이제 등을 제어, 양식, 메뉴, 서브 컨트롤을 사용하거나 사용하지 않도록 그냥 할 :

,
this.Enable(true); //Will enable all the controls and sub controls for this form 
this.Enable(false);//Will disable all the controls and sub controls for this form 

Button1.Enable(true); //Will enable only the Button1 

그래서, 나는, @ pinkfloydx33의 대답과 비슷한 무엇을 할 것 :

private void Form1_Load(object sender, EventArgs e) 
{ 
     this.Enable(false); 
     Button1.Enable(true); 
} 

가 정적이며 당신이 (수동) 인스턴스를 생성하지 않고 어디에서나 사용할 수 있기 때문에 내가 확장 방법을 좋아하고, 훨씬 명확입니다 적어도 나에게는.

+0

이것은 작동하지 않습니다. this.Enable (false)를 호출하면; Button1.Enable (true)를 호출하면이 (폼) 및 Button1의 다른 부모 컨트롤이 여전히 비활성화됩니다. –

+0

아마도 당신을 이해하지 못 하겠지만 그것이 중요한 부분이라고 생각합니다. 필요한 경우 Button1의 부모를 사용하도록 설정해보세요. 부모와 모든 자식 컨트롤을 사용하도록 설정해야합니다. – coloboxp

관련 문제