如何通过单击按钮更改所有标签前景色

How to change all label forecolor with a click of a button

我想创建一个按钮,单击按钮即可更改标签的前景色。但是每当我单击按钮时,它只会更改不在面板中的标签的前景色。 这是我的代码:

private void button1_Click(object sender, EventArgs e)
{
    this.BackColor = Color.White;
    foreach(Control l in Controls)
    {
        if(l is Label)
        {
            l.ForeColor = Color.Black;
        }           
    }
}

我试过使用

private void button1_Click(object sender, EventArgs e)
{
    this.BackColor = Color.White;
    foreach(Label l in Controls)
    {                
        l.ForeColor = Color.Black;
    }
}

但它给了我一个错误,说它无法将类型 System.Windows.Forms.Panel 的对象转换为类型 System.Windows.Forms.Label

您可以使用 Linq 过滤控件:

foreach (Label l in Controls.OfType<Label>())
{
    l.ForeColor = Color.Black;
}

编辑:

如果你有更深层次的控件,你可以递归地做:

private void SetLabelBlack(Control ctrl)
{
    foreach (Control c in ctrl.Controls)
    {
        Label l = c as Label;
        if (l != null)
        {
            l.ForeColor = Color.Black;
        }
        else
        {
            SetLabelBlack(c);
        }
    }
}

并这样称呼它:

SetLabelBlack(this);

你不能这样做

foreach(Label l in Controls)

因为 Controls 中并非所有 Control 都是 Label 类型

用 LINQ 做

foreach(Label l in panel.Controls.OfType<Label>())
    l.ForeColor = Color.Black

这样,您将首先从 Controls 中有选择地仅获取 Label 类型的 Control

编辑:

如果您在一个表单中有多个面板并且您想要更改所有面板内标签的所有颜色,您可以执行多个循环

foreach(Panel p in Controls.OfType<Panel>())
    foreach(Label l in p.Controls.OfType<Label>())    
        l.ForeColor = Color.Black;

如果您有一些 Label 不在面板中但在表单中,您可以将上面的内容与

结合使用
foreach(Label l in Controls.OfType<Label>())    
    l.ForeColor = Color.Black;

在列表(List) 中添加所有要更新的标签。然后遍历该列表中的所有标签并更新前景色。 panel.Controls returns 仅该面板中的控件,因此如果您要更新的标签不在该面板中 panel.Controls 将不起作用,而且它仅迭代那个面板。在面板中,您可以有另一个包含面板等的面板...

如错误提示您必须检查其类型!

private void button1_Click(object sender, EventArgs e)
{
this.BackColor = Color.White;
foreach(Control l in Controls)
{
    if(l.GetType()==typeof(System.Windows.Forms.Label))
    {
        l.ForeColor = Color.Black;
    }           
}
}
foreach(Control c in this.Controls)
                {
                    if(c is Label)
                    {
                        Label b = c as Label;
                        b.ForeColor = Color.White;
                    }
                }