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

时间:2015-12-30 13:48:47

标签: c# winforms button label

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

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类型。

5 个答案:

答案 0 :(得分:2)

您可以使用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);

答案 1 :(得分:2)

你不能这样做

foreach(Label l in Controls)

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

使用LINQ

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

这样,您首先会从Control选择性地仅获取Label类型的Controls

编辑:

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

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;

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

在列表中添加要更新的所有标签(列表)。然后迭代该列表中的所有标签并更新前景色。 panel.Controls仅返回该面板中的控件,因此如果要更新的标签不在该面板面板中。控件将不起作用,而且它仅对该面板的直接子节点进行迭代。在面板中,您可以拥有另一个包含面板等的面板......

答案 4 :(得分:-1)

foreach(Control c in this.Controls)
                {
                    if(c is Label)
                    {
                        Label b = c as Label;
                        b.ForeColor = Color.White;
                    }
                }