当用户单击按钮时,我希望禁用所有其他按钮

时间:2009-10-29 15:13:38

标签: c# winforms

我有一个winforms应用程序,主(也是唯一)表单有几个按钮。当用户单击按钮时,我希望禁用所有其他按钮。

我知道我可以通过在所有按钮上将“Enabled”设置为false来完成此操作,但是在该按钮的单击事件处理程序中单击了该按钮,但这是一个漫长而乏味的方法。

我在表单上获得了控件集合,但这不包括我的几个按钮:

        System.Windows.Forms.Control.ControlCollection ctrls = this.Controls;

如何以可持续的方式实现此功能?

由于

4 个答案:

答案 0 :(得分:2)

DisableControls(Control c)
{
    c.Enable  = false;
    foreach(Control child in c.Controls)
       DisableControls(child)
}

答案 1 :(得分:1)

private void Form1_Load(object sender, EventArgs e)
{
    foreach (Control ctrl in this.Controls)
    {
        if (ctrl is Button)
        {
            Button btn = (Button)ctrl;
            btn.Click += ButtonClick;
        }
    }

}

private void ButtonClick(object sender, EventArgs e)
{
    foreach (Control ctrl in this.Controls)
    {
        if (ctrl is Button)
        {
            Button btn = (Button)ctrl;
            if (btn != (Button)sender)
            {
                btn.Enabled = false;
            }
        }
    }
}

答案 2 :(得分:1)

您可以使用数据绑定,因此您只能在启动时迭代一次:

public partial class Form1 : Form
{
    public bool ButtonsEnabled { get; set; }

    public Form1()
    {
        InitializeComponent();

        // Enable by default
        ButtonsEnabled = true;

        // Set the bindings.
        FindButtons(this);
    }

    private void button_Click(object sender, EventArgs e)
    {
        // Set the bound property
        ButtonsEnabled = false;

        // Force the buttons to update themselves
        this.BindingContext[this].ResumeBinding();

        // Renable the clicked button
        Button thisButton = sender as Button;
        thisButton.Enabled = true;
    }

    private void FindButtons(Control control)
    {
        // If the control is a button, bind the Enabled property to ButtonsEnabled
        if (control is Button)
        {
            control.DataBindings.Add("Enabled", this, "ButtonsEnabled");
        }

        // Check it's children
        foreach(Control child in control.Controls)
        {
            FindButtons(child);
        }
    }
}

答案 3 :(得分:0)

扩展Alex Reitbort的答案,这是我刚刚在20分钟前为我正在做的这个项目写的一个示例方法:

    private void Foo(bool enabled)
    {
        foreach (Control c in this.Controls)
            if (c is Button && c.Tag != null)
                c.Enabled = enabled;
    }

此函数递归,就像他的那样。但是,因为我知道除了我的表单之外的容器中没有按钮,所以我不需要担心。如果子控件(例如GroupBox中的控件),我可能会将该代码修改为这样的代码;

    private void ToggleControls()
    {
             Foo(this.Controls, false) // this being the form, of course.
    }

    private void Foo(Control.ControlCollection controls, bool enabled)
    {
        foreach (Control c in controls)
        {
            if (c is Button && c.Tag != null)
                c.Enabled = enabled;
            if (c.HasChildren)
                Foo(c.Controls, enabled);
        }
    }

我实际上更喜欢他的方法,那种递归方式看起来比我想象的要清洁一点。只是向您展示另一种方式。

请注意;我的表单上有6个按钮,我只想让其中4个按钮通过此方法修改其Enabled属性。为此,我将Tag属性设置为一些随机字符串。这就是我在if语句中检查c.Tag的原因。如果您知道要禁用每个控件,则可以删除它。