我有一个消息框,询问用户是否要重新启动。
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 :(得分:6)
我相信你要做的是将每个标签的文本重置为0,如果是这样的话
foreach(Label l in this.Controls.OfType<Label>())
l.Text = "0";
在旁注中,您应该尝试为控件提供有意义的名称,以便在维护代码时提供帮助
修改强>
一种更强大的方法,但为了确保您不重置您不希望更改的文本,您可以创建标签的子类,然后将此类用于可以重置的标签
class ResettableLabel : Label
foreach(ResettableLabel l in this.Controls.OfType<ResettableLabel >())...
答案 1 :(得分:5)
我说你可以使用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");
答案 2 :(得分:2)
您可以将所有标签添加到集合或列表中。然后你可以轻松地ForEach列表。
var allLabels = new List<Label>( { label1, label2, label3, ... , label60});
allLabels.ForEach(l=> l.Text = "0");
答案 3 :(得分:1)
是的,您可以使用这样的反射:
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";
}
简而言之,有很多方法可以让这只猫受到伤害。在我提供的两个中,第二个将更有效,可能是我的选择。
答案 4 :(得分:1)
使用反射:
// using System.Reflection;
for (int i = 1; i <= 60; i++)
((Label)this.GetType().GetField("label" + i, BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this)).Text = "0";