根据与变量匹配的文本查找标签名称

时间:2019-09-22 19:01:30

标签: c# winforms

在Visual Studio中的C#Winform中,我有139个标签的网格,每个标签显示一个唯一的文本值-当变量与label.text属性之一匹配时,如何更改这些标签之一的颜色,而又不知道哪个标签

例如,我单击一个数据网格行并将其设置为代码GG的变量,如何找到网格中哪个标签的文本属性为GG,然后仅更改该标签的颜色

网格位于选项卡控制页面中,因此它也必须在正确的选项卡页面上更新(一个处于活动状态)

尝试解决问题的完整新手

预先感谢

1 个答案:

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