如何循环遍历所有文本框控件并更改相关的标签颜色

本文关键字:控件 颜色 标签 文本 何循环 循环 遍历 | 更新日期: 2023-09-27 17:50:55

        foreach (Control c in this.Controls)
        {
           if (c is TextBox && c.Text.Length==0)
           {
               // [Associatedlabel].ForeColor = System.Drawing.Color.Red;
               err = true;
           }

而不是[Associatedlabel],我想将每个文本框与标签相关联,所以最终文本框附近的所有空标签都将是红色的,这是如何做到的?谢谢。

如何循环遍历所有文本框控件并更改相关的标签颜色

没有很好的方法可以从文本框中找到标签控件。使用表单的GetChildAtPoint()方法可以很容易地工作,但总有一天会后悔的。命名有帮助,比如FooBarLabel匹配FooBarTextBox。现在您可以简单地使用Controls集合查找标签:

 var label = (Label)this.Controls[box.Name.Replace("TextBox", "Label")];
但是Winforms通过简单的继承解决了很多问题。向项目中添加一个新类并粘贴以下代码:
using System;
using System.Windows.Forms;
class LabeledTextBox : TextBox {
    public Label Label { get; set; }
}

编译并从工具箱顶部拖放新控件。在设计器中设置Label属性,只需从下拉列表中选择即可。Boomshakalaka .

您可以首先手动设置TextBox的Tag属性为这些标签。标记旨在包含用户定义的数据,因此您可以在其中放置任何object。然后你可以简单地做:

foreach (Control c in this.Controls)
{
    if (c is TextBox && c.Text.Length==0 && c.Tag is Label)
    {
        ((Label)c.Tag).ForeColor = System.Drawing.Color.Red;
        err = true;
    }
}

这是最简单的解决方案,但是还有一些更复杂的解决方案。

  1. 创建包含标签、文本框和自定义行为的自定义复合控件;
  2. 创建一个从文本框派生的控件,该文本框存储有关它所连接的标签的信息(如Hans Passant所建议的)
  3. 创建Dictionary<TextBox, Label>Dictionary<Control, Label>,允许在运行时解决这些问题(Steve的想法的变化)。

我想你使用的是WinForms。在此环境中,没有任何将标签与文本框关联的内置功能。所以你需要建立你自己的关联。

可以在代码的构造函数中创建字典

public class MyForm : Form
{
     private Dictionary<string, Label> assoc = new Dictionary<string, Label>();
     public MyForm()
     {
         // Key=Name of the TextBox, Value=Label associated with that textbox
         assoc.Add("textbox1", Label1);
         assoc.Add("textbox2", Label2);
         assoc.Add("textbox3", Label3);
     }
}
.....
foreach (TextBox t in this.Controls.OfType<TextBox>())
{
   if(t.Text.Length == 0)
   {
        assoc[t.Name].ForeColor = System.Drawing.Color.Red;
        err = true;
   }
   else
        assoc[t.Name].ForeColor = ??? system forecolor ???
}