我想创建一个按钮,通过单击按钮更改标签的前景色。但每当我点击按钮时,它只会改变不在面板中的标签的前景色。 这是我的代码:
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
类型。
答案 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;
}
}