2013-07-10 41 views
1

我有一個消息框詢問用戶是否要重新啓動。引用C#中的標籤序列

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

你在哪裏使用這個消息框? – Sayse

回答

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

是的,你可以使用這樣的反思:

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

總之,有很多的方式來皮膚這隻貓。在我提供的兩個中,第二個將會更有效率,並且可能是我的選擇。

2

您可以將所有的標籤添加到集合或名單。那麼你可以很容易地找到列表。

var allLabels = new List<Label>({ label1, label2, label3, ... , label60}); 
allLabels.ForEach(l=> l.Text = "0"); 
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"; 
+0

糟糕...我第一次回答就等於說'label1 =「0」;'。現在我修復它以添加'.Text'。 – Jashaszun

+0

再次修復它,因爲您需要'BindingFlags'來搜索非公共變量。它現在應該完全工作。 – Jashaszun