我正在编写一个 WinForms 应用程序。我有很多标签代表某种状态(启用/禁用等)。我希望每个状态都是不同的颜色(绿色,灰色......)。我知道实现这一点的唯一方法是检查 label.Text 是否与所需状态匹配,然后更改其前景色。但这是一个艰难的方法,因为我每次在应用程序中设置状态标签时都需要执行此检查。
我想知道是否有任何方法可以“在一个地方”做到这一点?例如,编写一个方法来检查特定字符串的所有标签,然后从 Form_Load() 调用它
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.
将所有标签添加到 Form_Load() 上的列表中,然后您可以执行 .Where(l => l.Text == "String you are looking for")。遍历那些以适当地设置前景色
使用表单控件及其子控件枚举表单上的所有标签,例如使用此 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
}
}
您还可以利用标签控件的 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