参考标签的序列在C#(Reference a sequence of labels in C#)

2019-10-18 09:01发布

我有一个询问是否要重新启动用户的消息框。

if (MessageBox.Show("Restart?", 
      "Restart and Clear", 
       MessageBoxButtons.YesNo) == DialogResult.Yes)
{
    labels.Text="0"
}

而不是“标签”我想用LABEL1,LABEL2,LABEL3等一路label60。 我可以做label1.Text = label2.Text .... = 0,但是这将需要一段时间。 有没有一种简单的方法为语句做到这一点,可能使用?

Answer 1:

我说你可以使用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");


Answer 2:

我相信你正在尝试做的是复位每个标签的文本为0,如果是这样

foreach(Label l in this.Controls.OfType<Label>())
   l.Text = "0";

在一个侧面说明,你应该试着给你的控件有意义的名称,以帮助维护你的代码的时候

编辑

但一个更可靠的方法,以确保你不会重置你不想改变你可以使标签的一个子类,然后使用这个类的标签,可以重置文本

class ResettableLabel : Label
foreach(ResettableLabel l in this.Controls.OfType<ResettableLabel >())...


Answer 3:

你可以你所有的标签添加到集合或列表。 然后,你可以很容易的foreach列表。

var allLabels = new List<Label>( { label1, label2, label3, ... , label60});
allLabels.ForEach(l=> l.Text = "0");


Answer 4:

是的,你可以使用这样的反思:

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";
}

总之,有很多方法对皮肤这只猫。 走出我提供的两个,第二个将是更高效,更可能会是我的选择。



Answer 5:

使用反射:

// using System.Reflection;
for (int i = 1; i <= 60; i++)
    ((Label)this.GetType().GetField("label" + i, BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this)).Text = "0";


文章来源: Reference a sequence of labels in C#