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

本文关键字:运行时 消失 标签 添加 动态 | 更新日期: 2023-09-27 18:32:23

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

这是我的代码:

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,这意味着您所做的只是更改循环内相同Label的位置和文本。

lenlab[i] = lab;

看到的行为是由于您只能将特定控件添加到this.Controls一次,因此效果是你会看到相同的标签更改位置。

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

// Remove the new control from its old parent (if any)
if (value.parent != null) {
    value.parent.Controls.Remove(value);
}

相反,请在for循环中创建一个新Label

lenlab[i] = new Label();

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

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

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