引用C#中的一系列标签
本文关键字:一系列 标签 引用 | 更新日期: 2023-09-27 18:21:48
我有一个消息框,询问用户是否要重新启动。
if (MessageBox.Show("Restart?",
"Restart and Clear",
MessageBoxButtons.YesNo) == DialogResult.Yes)
{
labels.Text="0"
}
我想使用label1、label2、label3等,而不是"标签",一直到label60。我可以做label1.Text=label2.Text…=0,但那需要一段时间。有没有一种简单的方法可以做到这一点,可能使用for语句?
我相信你要做的是将每个标签的文本重置为0,如果是的话
foreach(Label l in this.Controls.OfType<Label>())
l.Text = "0";
顺便说一句,你应该试着给你的控件起有意义的名字,以帮助维护你的代码
编辑
一种更稳健的方法,但为了确保你不会重置你不想更改的文本,你可以创建一个标签的子类,然后将这个类用于可以重置的标签
class ResettableLabel : Label
foreach(ResettableLabel l in this.Controls.OfType<ResettableLabel >())...
我认为您可以使用Control.ControlCollection.Find
for (int i = 1; i <= 60; i++)
{
label = Controls.Find("label" + i.ToString()) as Label;
label.Text="0"
}
没有测试,但我认为这个Linq版本应该做同样的
Enumerable
.Range(1, 60)
.ToList()
.ForEach(i => (Controls.Find("label" + i.ToString()) as Label).Text = "0");
您可以将所有标签添加到集合或列表中。然后你就可以很容易地为每个列表添加ForEach。
var allLabels = new List<Label>( { label1, label2, label3, ... , label60});
allLabels.ForEach(l=> l.Text = "0");
是的,您可以使用这样的反射:
for (int i = 1; i <= 60; i++)
{
var fi = this.GetType().GetField(string.Format("label{0}", i));
if (fi == null) { continue; }
fi.SetValue(this, "0");
}
另一种方法是使用Find
方法:
for (int i = 1; i <= 60; i++)
{
var c = this.Controls.Find(string.Format("label{0}", i), true);
if (c == null) { continue; }
((Label)c).Text = "0";
}
简而言之,有很多方法可以剥这只猫的皮。在我提供的两个中,第二个会更有效率,可能是我的选择。
使用反射:
// using System.Reflection;
for (int i = 1; i <= 60; i++)
((Label)this.GetType().GetField("label" + i, BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this)).Text = "0";