我想创建一个按钮,通过单击按钮更改标签的前景色。但每当我点击按钮时,它只会改变不在面板中的标签的前景色。这是我的代码:
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
。
你不能做这个
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
s不在面板但在表格中,你可以结合以上与
foreach(Label l in Controls.OfType<Label>())
l.ForeColor = Color.Black;
您可以使用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);
由于错误建议你必须检查其类型!
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;
}
}
}
在列表中添加要更新的所有标签(列表)。然后迭代该列表中的所有标签并更新前景色。 panel.Controls仅返回该面板中的控件,因此如果要更新的标签不在该面板面板中。控件将不起作用,而且它仅对该面板的直接子节点进行迭代。在面板中,您可以拥有另一个包含面板等的面板......
foreach(Control c in this.Controls)
{
if(c is Label)
{
Label b = c as Label;
b.ForeColor = Color.White;
}
}