如何控制表单上的所有元素

时间:2013-09-28 10:01:50

标签: c# .net winforms foreach controls

尝试启用或禁用表单上的某些元素(复选框和文本框) 阅读this post,并重新编写这段代码

代码:

    private void checkBoxEnableHotKeys_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBoxEnableHotKeys.Checked)
        {
            EnableControls(this.Controls, true);
        } //works perfect
        if (!checkBoxEnableHotKeys.Checked)
        {
            EnableControls(this.Controls, false);
        } //disable all controls
    }

    private void EnableControls(Control.ControlCollection controls, bool status)
    {
        foreach (Control c in controls)
        {   
            c.Enabled = status;         
            if (c is MenuStrip)
            {
                c.Enabled = true;
            }
            if (c.Controls.Count > 0)
            {
                EnableControls(c.Controls, status);
            }
        }
        checkBoxEnableHotKeys.Enabled = true; //not work 
    }

我犯了错误?为什么checkBoxEnableHotKeys.Enabled = true;不起作用? ( - 在将这部分代码传递给false并且操作=无法正常工作时 - 假前和假后......)

1 个答案:

答案 0 :(得分:1)

我喜欢返回表单所有子控件的方法 - 包括嵌套控件。

来自:Foreach Control in form, how can I do something to all the TextBoxes in my Form?

我喜欢这个答案:

这里的技巧是控件不是List<>或IEnumerable但是ControlCollection。

我建议使用Control的扩展名,它将返回更多的内容。)

public static IEnumerable<Control> All(this ControlCollection controls)
    {
        foreach (Control control in controls)
        {
            foreach (Control grandChild in control.Controls.All())
                yield return grandChild;

            yield return control;
        }
    }

然后你可以这样做:

foreach(var textbox in this.Controls.All().OfType<TextBox>)
{
    // Apply logic to the textbox here
}