如何禁用所有控件在窗体上除了一个按钮?(How to disable all controls on

2019-07-03 23:11发布

我的形式有数百个控件:菜单,面板,分离器,标签,文本框,你的名字。

有没有一种方法来禁用除一个按钮每个控制?

之所以按钮显著是因为我不能使用禁用窗口或东西,因为一个控制仍然需要使用的方法。

Answer 1:

你可以做一个递归调用禁用所有相关的控制。 然后,你必须使你的按钮和任何父容器。

 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);
        }
    }


Answer 2:

根据@ 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);
}

我喜欢扩展方法,因为它们都是静态的,你可以在任何地方使用它,而无需创建实例(手动),它至少是更清晰了我。



Answer 3:

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

如果你真的想保持当前的设计,可以线性化的ControlCollection树成控制的阵列 ,以避免递归,然后执行以下操作:

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


Answer 4:

当你有很多面板或tableLayoutPanels嵌套的情况变得非常棘手。 试图禁用面板禁用父面板,然后让孩子控制不使控制在所有的所有控件,因为父(或母的父母)未启用。 为了保持使能看见的形式布局与窗体本身为根,任何容器或面板作为分支和子控件(按钮,文本框,标签等)作为叶节点树所期望的子控件。 因此,主要的目标是相同的水平所需的控制范围内禁止所有节点,一路爬上控制树的形式层面,stablishing启用控件,以便孩子可以正常工作的路径:

public static void DeshabilitarControles(Control control)
{
    if (control.Parent != null)
    {
        Control padre = control.Parent;
        DeshabilitarControles(control, padre);
    }
}

private static void DeshabilitarControles(Control control, Control padre)
{
    foreach (Control c in padre.Controls)
    {
        c.Enabled = c == control;
    }
    if (padre.Parent != null)
    {
        control = control.Parent;
        padre = padre.Parent;
        DeshabilitarControles(control, padre);
    }
}

public static void HabilitarControles(Control control)
{
    if (control != null)
    {
        control.Enabled = true;
        foreach (Control c in control.Controls)
        {
            HabilitarControles(c);
        }
    }
}


文章来源: How to disable all controls on the form except for a button?