C# c中指向标签的引用(或指针)数组#

C# c中指向标签的引用(或指针)数组#,c#,winforms,user-interface,C#,Winforms,User Interface,假设我有一个带有一长串温度读数的表单,那么在设计器中: this.lblTemperatureDevice01 = new System.Windows.Forms.Label(); this.lblTemperatureDevice02 = new System.Windows.Forms.Label(); this.lblTemperatureDevice03 = new System.Windows.Forms.Label(); // ... this.lblTemperatureDevi

假设我有一个带有一长串温度读数的表单,那么在设计器中:

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

或者有没有一种方法可以在不创建新标签的情况下获取现有标签的引用(或指针)?来自C++背景,我可能只是简单地将每个标签的地址存储在数组中。

,可以从控件

的控件集合中获取所有标签。
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();
}
private Label[]标签;
博士
{
初始化组件();
labels=this.Controls.OfType()
.Where(lbl=>lbl.Name.StartsWith(“lblTemperatureDevice”))
.OrderBy(lbl=>int.Parse(lbl.Name.Replace(“lblTemperatureDevice”,”))
.ToArray();
}

使用设计器仅创建其中两个标签

看看设计师做了什么

InitializeComponents()之后创建一个循环,在程序中创建一个标签数组


扔掉设计人员(这些标签)的所有代码。

标签是参考<代码>标签副本=LBL温度设备01
-
copy
指向与
lbl…01
new Label[]
创建的只是数组,而不是
标签本身相同的对象。NET中唯一具有值语义的是值类型-原语(
string
是一个例外),
struct
s。当您使用设计器在表单上放置50个标签时,您确实做得非常糟糕。程序员做任何事情都不会超过两次。扔掉这个,重新开始。如果你不知道该写什么代码,那么首先看看设计师是怎么写的。然后只做一次,就像它做了50次一样。我的评论涉及到你的一句话:有没有一种方法可以在不创建新标签的情况下获得现有标签的引用(或指针)?也就是说,你会在现有代码中的何处创建新标签?@HansPassant:你的意思是在主表单代码中创建标签,而不是通过设计器添加标签?想想看,这是一个更好的方法!省略OrderBy()是一个非常糟糕的主意。
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();
}