在Visual Studio中的C#Winform中,我有139个标签的网格,每个标签显示一个唯一的文本值-当变量与label.text属性之一匹配时,如何更改这些标签之一的颜色,而又不知道哪个标签
例如,我单击一个数据网格行并将其设置为代码GG的变量,如何找到网格中哪个标签的文本属性为GG,然后仅更改该标签的颜色
网格位于选项卡控制页面中,因此它也必须在正确的选项卡页面上更新(一个处于活动状态)
尝试解决问题的完整新手
预先感谢
答案 0 :(得分:1)
假设我们的139个标签的文本为“ label-xxx”,其中xxx为数字,而我们正在寻找“ label-121”并希望将其设置为红色:
var c = this.Controls.FirstOrDefault(ctrl => ctrl is Label && ctrl.Text == "label-121");
if(c == null) {
//put code here to handle the scenario where the label is not found
} else {
c.BackColor = Color.Red;
}
请注意,“ this”是指表单本身。如果您的标签位于面板,组框等内部,则必须枚举该面板的.Controls而不是表单,因为它是层次结构。如果标签位于多个不同的面板中,请提出建议,因为您需要使用不同的循环方式
实际上,我们不需要将控件转换为标签,因为Text和BackColor属性是在控件级别而不是Label子类中引入继承层次结构的。如果要更改其他仅是Label的属性,则必须将c
强制转换为Label
我确实认为最好还是声明一个Dictionary<string, Label>
,并在将它们放在表单上时(或从Controls集合中填充它)用标签填充-如果标签文本没有不能更改,这将是一种更清洁的跟踪方式
要使Linq正常工作,通常只需在文件顶部添加一个using System.Linq;
,并在其中添加其余代码。System.Linq是System.Core程序集的成员。如果您的项目缺少对它的引用,那么您可能会看到有关其为未知名称空间的错误
这是代码的非linq版本:
foreach(Control c in this.Controls)
{
if(c is Label && c.Text == "label-121")
{
c.BackColor = Color.Red;
}
}