1

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

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

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

4

5 回答 5

6

我相信您要做的是将每个标签的文本重置为 0 如果是这样

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

附带说明一下,您应该尝试为控件提供有意义的名称,以帮助维护您的代码

编辑

一种更强大的方法,但为了确保您不会重置您不想更改的文本,您可以创建标签的子类,然后将此类用于可以重置的标签

class ResettableLabel : Label
foreach(ResettableLabel l in this.Controls.OfType<ResettableLabel >())...
于 2013-07-10T18:53:41.697 回答
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");
于 2013-07-10T18:54:26.447 回答
2

您可以将所有标签添加到集合或列表中。然后你可以很容易地 ForEach 列表。

var allLabels = new List<Label>( { label1, label2, label3, ... , label60});
allLabels.ForEach(l=> l.Text = "0");
于 2013-07-10T18:54:44.323 回答
1

Use reflection:

// using System.Reflection;
for (int i = 1; i <= 60; i++)
    ((Label)this.GetType().GetField("label" + i, BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this)).Text = "0";
于 2013-07-10T18:56:24.673 回答
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";
}

简而言之,有很多方法可以给这只猫剥皮。在我提供的两个中,第二个会更有效率,可能是我的选择。

于 2013-07-10T18:53:51.897 回答