我的表單有數百個控件:菜單,面板,分隔符,標籤,文本框,您可以將其命名。如何禁用除了按鈕之外的窗體上的所有控件?
是否有一種方法可以禁用除單個按鈕之外的每個控件?
按鈕之所以重要,是因爲我不能使用禁用窗口的方法,或者因爲一個控件仍然需要可用。
我的表單有數百個控件:菜單,面板,分隔符,標籤,文本框,您可以將其命名。如何禁用除了按鈕之外的窗體上的所有控件?
是否有一種方法可以禁用除單個按鈕之外的每個控件?
按鈕之所以重要,是因爲我不能使用禁用窗口的方法,或者因爲一個控件仍然需要可用。
您可以執行遞歸調用來禁用所有涉及的控件。然後你必須啓用你的按鈕和任何父容器。
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);
}
}
你爲什麼要在那裏包含ref關鍵字? –
我不會。我在打電話的時候打了電話,出於某種原因,它剛出來 – pinkfloydx33
Ha。做得好。我喜歡你如何讓方法不知道或關心任何特定的控制。新手們會忽略那樣的事情。 –
爲了更好,更優雅的解決方案,這將是易於維護 - 你可能需要重新考慮你的設計,比如把你的按鈕除了其他控件。然後假設其他控件位於面板或組框中,只需執行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提及重新考慮設計。 –
對於'Panel.Enabled = false | true'爲+1。重新設計界面以創建一組控件,然後禁用整個組,肯定是設計UI的更好方式。 – sentenza
基於@ 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);
}
我喜歡擴展方法,因爲它們都是靜態的,你可以在任何地方使用它,而無需創建實例(手動),它是更清晰至少對於我來說。
這不起作用。如果你調用this.Enable(false);然後調用Button1.Enable(true),那麼Button1的這個(表單)和其他父控件仍然被禁用。 –
也許我不明白你,但我認爲這是重點。 嘗試啓用Button1的父級,如果這是你所需要的,它應該啓用父級和所有它的子級控件。 – coloboxp
你應該把按鈕放在一個單獨的窗體中嗎? – SLaks
難道你不能只是遍歷窗體上的所有控件,在每個控件上設置Enabled屬性?在循環中,使用其ID /名稱忽略該按鈕。或者,繼續並禁用循環中的所有內容,然後立即啓用該按鈕。 –