C# 动态添加的标签在运行时消失

C# 动态添加的标签在运行时消失,c#,winforms,label,C#,Winforms,Label,我以编程方式将标签添加到表单中,但除了最后一个标签外,标签消失了。我确信给他们指定的位置是合适的。但是当第二个标签出现时,第一个标签消失,或者当第三个标签出现时,第二个标签消失 这是我的密码: Label[] lenlab = new Label[255]; Label lab = new Label(); lab.Font = new Font("Microsoft Sans Serif", 10, FontStyle.Bold); lab.ForeColor = Color.White;

我以编程方式将标签添加到表单中,但除了最后一个标签外,标签消失了。我确信给他们指定的位置是合适的。但是当第二个标签出现时,第一个标签消失,或者当第三个标签出现时,第二个标签消失

这是我的密码:

Label[] lenlab = new Label[255];

Label lab = new Label();
lab.Font = new Font("Microsoft Sans Serif", 10, FontStyle.Bold);
lab.ForeColor = Color.White;
lab.BackColor = Color.Transparent;
lab.AutoSize = true;

lenlab[1] = lab;
lenlab[1].Location = new Point(50, panel1.Location.Y + panel1.Height + 20);
lenlab[1].Text = c[1];
this.Controls.Add(lenlab[1]);

for (int i = 2; i < c.Count; i++) 
{
    lenlab[i] = lab;
    lenlab[i].Location = new Point(lenlab[i - 1].Location.X + lenlab[i -1].Width + 40, lenlab[i - 1].Location.Y);
    lenlab[i].Text = " + " + c[i];
    this.Controls.Add(lenlab[i]);
}
Label[]lenlab=新标签[255];
Label lab=新标签();
lab.Font=新字体(“Microsoft无衬线字体”,10,FontStyle.Bold);
lab.ForeColor=颜色。白色;
lab.BackColor=Color.Transparent;
lab.AutoSize=true;
lenlab[1]=实验室;
lenlab[1]。位置=新点(50,panel1.Location.Y+panel1.Height+20);
lenlab[1]。Text=c[1];
this.Controls.Add(lenlab[1]);
对于(int i=2;i
这一行使数组中的每个位置都引用了您最初在循环外部创建的相同的
标签,这意味着您所做的只是更改循环内部相同的
标签的位置和文本

lenlab[i] = lab;
您看到的行为是由于您只能将特定控件添加到
this.Controls
一次,因此效果是您看到相同的标签更改位置

下面是
Add()
方法的一部分,该部分检查要添加的控件是否已经有父控件,如果已经有父控件,则在将其添加到新控件之前将其从当前父控件中删除。因此,每次使用相同的
标签调用
this.Controls.Add()
,它都会将其从
表单中删除,然后再次添加

// Remove the new control from its old parent (if any)
if (value.parent != null) {
    value.parent.Controls.Remove(value);
}
相反,在
for
循环中创建一个新的
标签

lenlab[i] = new Label();

有一些控件可以帮助您布局控件,而无需每次计算新位置。特别是,请仔细阅读和类。

您在那里所做的基本上是创建一个标签,将其更改几次,并将其多次附加到页面上。您在页面上看到的是添加一次标签的最后版本,这是预期的行为


如果要添加多个标签,则需要
新建每个标签。

看起来您只创建了一个标签。您分别添加了对同一个标签的引用,但只有一个。统计新的
呼叫数!-此外,我们更希望看到真正的代码;这无法编译…谢谢你的回答,我正在努力@谢谢你的回答!太好了@米海:非常感谢你,成功了。你的推荐对我很有帮助。再次感谢你@格兰特·温尼