2012-11-19 29 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

Ha。做得好。我喜欢你如何让方法不知道或关心任何特定的控制。新手们会忽略那样的事情。 –

8

为了更好,更优雅的解决方案,这将是易于维护 - 你可能需要重新考虑你的设计,比如把你的按钮除了其他控件。然后假设其他控件位于面板或组框中,只需执行Panel.Enabled = False即可。

如果你真的想保持当前的设计,你可以Linearise ControlCollection tree into array of Control避免递归,然后执行以下操作:

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

+1提及重新考虑设计。 –

+0

对于'Panel.Enabled = false | true'为+1。重新设计界面以创建一组控件,然后禁用整个组,肯定是设计UI的更好方式。 – sentenza

10

基于@ pinkfloydx33的答案,我就可以做编辑,我创建了一个扩展方法使得它更容易,只需创建一个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

相关问题