0

我正在编写一个 WinForms 应用程序。我有很多标签代表某种状态(启用/禁用等)。我希望每个状态都是不同的颜色(绿色,灰色......)。我知道实现这一点的唯一方法是检查 label.Text 是否与所需状态匹配,然后更改其前景色。但这是一个艰难的方法,因为我每次在应用程序中设置状态标签时都需要执行此检查。

我想知道是否有任何方法可以“在一个地方”做到这一点?例如,编写一个方法来检查特定字符串的所有标签,然后从 Form_Load() 调用它

4

4 回答 4

3

You could create your own custom label class which inherits from the Label class. Something like this:

public class MyLabel : Label
{
    public MyLabel()
    {
        if(this.Text == "something")
        {
            this.ForeColor = Color.Green;
        }
    }

    protected override void OnTextChanged(EventArgs e)
    {
        if(this.Text == "something")
        {
            this.ForeColor = Color.Green;
        }
    }
}

And so instead of using Label use MyLabel everywhere.

于 2012-05-02T20:55:42.030 回答
1

将所有标签添加到 Form_Load() 上的列表中,然后您可以执行 .Where(l => l.Text == "String you are looking for")。遍历那些以适当地设置前景色

于 2012-05-02T20:54:05.387 回答
0

使用表单控件及其子控件枚举表单上的所有标签,例如使用此 SO 答案中的 GetAll 方法:

如何获取特定类型(按钮/文本框)的 Windows 窗体窗体的所有子控件?

然后设置适当的颜色,如下所示:

var allLabels = GetAll(form, typeof(Label)); /// you can use this as first param if in form methods
foreach(Label oneLabel in allLabels)
{
  if (oneLabel.Text == "Something")
  {
    // set color or whatever
  }
}
于 2012-05-02T20:58:21.693 回答
0

您还可以利用标签控件的 Tag 属性。将用于显示状态的所有标签控件的标记设置为“状态”,并在 Page_Load 事件中旋转循环以设置前景色。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    For Each control In Me.Controls
        If (TypeOf (control) Is Label) Then
            Dim statusLabel As Label
            statusLabel = control
            If (statusLabel.Tag = "Status") Then
                statusLabel.ForeColor = Color.Red
            End If
        End If
    Next
End Sub
于 2012-05-02T20:59:30.657 回答