C# 在C中引用一系列标签#

C# 在C中引用一系列标签#,c#,winforms,controls,label,sequence,C#,Winforms,Controls,Label,Sequence,我有一个消息框,询问用户是否要重新启动 if (MessageBox.Show("Restart?", "Restart and Clear", MessageBoxButtons.YesNo) == DialogResult.Yes) { labels.Text="0" } 我想用label1、label2、label3等来代替“标签”,一直到label60。我可以做label1.Text=label2.Text….=0但这需要一段时间。有没有一种简单的

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

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";
foreach(此.Controls.OfType()中的标签l)
l、 Text=“0”;
另一方面,您应该尝试为控件指定有意义的名称,以便在维护代码时提供帮助

编辑

一种更健壮的方法,但为了确保不重置不希望更改的文本,可以创建label的子类,然后将此类用于可以重置的标签

class ResettableLabel : Label
foreach(ResettableLabel l in this.Controls.OfType<ResettableLabel >())...
class ResettableLabel:标签
foreach(此.Controls.OfType()中的ResettableLabel l)。。。

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

foreach(Label l in this.Controls.OfType<Label>())
   l.Text = "0";
foreach(此.Controls.OfType()中的标签l)
l、 Text=“0”;
另一方面,您应该尝试为控件指定有意义的名称,以便在维护代码时提供帮助

编辑

一种更健壮的方法,但为了确保不重置不希望更改的文本,可以创建label的子类,然后将此类用于可以重置的标签

class ResettableLabel : Label
foreach(ResettableLabel l in this.Controls.OfType<ResettableLabel >())...
class ResettableLabel:标签
foreach(此.Controls.OfType()中的ResettableLabel l)。。。

是的,您可以像这样使用反射:

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

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

是的,您可以使用如下反射:

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");
}
简言之,有很多方法可以剥这只猫的皮。在我提供的两种方案中,第二种方案效率更高,可能是我的选择。

我认为您可以使用

我想你可以用


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

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

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

var allLabels = new List<Label>( { label1, label2, label3, ... , label60});
allLabels.ForEach(l=> l.Text = "0");
var allLabels=新列表({label1,label2,label3,…,label60});
allLabels.ForEach(l=>l.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";
//使用System.Reflection;
对于(int i=1;i使用反射:

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

对于(int i=1;i您在哪里使用此messagebox?您在哪里使用此messagebox?哎呀…我第一次回答时等于说
label1=“0”
。现在我修复了它,添加了
。Text
。再次修复了它,因为您需要
绑定标志来搜索非公共变量。它现在应该可以完全工作了。哎呀……我第一次回答这个问题就相当于说
label1=“0”;
。现在我修复了它,添加了
。Text
。再次修复了它,因为您需要
BindingFlags
来搜索非公共变量。它现在应该可以完全工作了。