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

相關問題