2015-03-31 50 views
1

說我有具有長一堆溫度讀數的形式,所以在設計:陣列的引用(或指針)的標籤在c#

this.lblTemperatureDevice01 = new System.Windows.Forms.Label(); 
this.lblTemperatureDevice02 = new System.Windows.Forms.Label(); 
this.lblTemperatureDevice03 = new System.Windows.Forms.Label(); 
// ... 
this.lblTemperatureDevice50 = new System.Windows.Forms.Label(); 

在主要形式代碼,如何添加的標籤到一個數組,這樣我可以在一個計時器事件例如使用循環更新標籤:

private void tmrUpdateLabels_Tick(object sender, EventArgs e) 
{ 
    // Disable timer 
    tmrUpdateLabels.Enabled = false; 
    if (m_bExiting) 
     return; 

    // Update temperatures (if device has returned a reading) 
    for (int device = 0; device < MAX_DEVICES; device++) 
    { 
     if (m_aHasNewReading[device]) 
     { 
      m_aHasNewReading[device] = false; 
      labels[device].Text = m_aTemperature[device].ToString(); 
     } 
    } 

    // Restart timer 
    tmrUpdateLabels.Enabled = true; 
} 

如何創建標籤[MAX_DEVICES]數組?我必須使用:

private Label[] labels = new Label[MAX_DEVICES]; 

或者有沒有辦法在不創建新標籤的情況下獲得對現有標籤的引用(或指針)?來自C++背景,我可能簡單地將每個標籤的地址存儲在一個數組中。

+0

標籤*爲*參考。 'Label copy = lblTemperatureDevice01;''copy''指向與'lbl ... 01'相同的對象' – Default 2015-03-31 10:55:40

+1

'new Label []'只創建數組,而不是'Label'本身。 .NET中唯一具有價值語義的是值類型 - 原語('string'是一個例外),'struct'。 – Luaan 2015-03-31 10:56:00

+2

當您使用設計器在表單上放置50個標籤時,您確實走得很深。程序員永遠不會做任何事情超過兩次。扔掉這個並重新開始。如果你不知道要寫什麼代碼,那麼首先要看設計師做的方式。然後只做*一次*做了50次。 – 2015-03-31 10:56:48

回答

1

創建短短兩年這些標籤與設計師的。

看看設計師製作了什麼。

創建一個循環創建標籤的程序中的一個數組,剛過InitializeComponents();

遙,從desgner(這些標籤)的所有代碼了。

2

你可以把所有標籤從表單控件集合

private Label[] labels; 
.ctor 
{ 
    InitializeComponent(); 
    labels = this.Controls.OfType<Label>() 
      .Where(lbl => lbl.Name.StartsWith("lblTemperatureDevice")) 
      .OrderBy(lbl => int.Parse(lbl.Name.Replace("lblTemperatureDevice",""))) 
      .ToArray(); 
} 
+1

省略OrderBy()是一個非常糟糕的主意。 – 2015-03-31 11:04:00