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

时间:2014-11-29 14:27:26

标签: 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;
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]);
}

2 个答案:

答案 0 :(得分:1)

这一行导致数组中的每个位置都引用了您在循环之外创建的同一Label,这意味着您所做的只是改变<的位置和文本你的循环中有相同的 Label

lenlab[i] = lab;

您看到的行为是由于您只能将特定控件添加到this.Controls一次,因此效果是您看到相同的标签发生了变化位置。

这是Add()方法的一部分,用于检查您添加的控件是否已经存在父级,如果是,则将其从当前删除将父级添加到新父级之前的父级。因此,每当您使用相同的this.Controls.Add()致电Label时,它会将其从Form中移除,然后再将其添加。

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

而是在Label循环中创建一个新的for

lenlab[i] = new Label();

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

答案 1 :(得分:1)

你在做什么基本上是创建一个 Label,多次更改,并将其多次附加到页面。你最终在页面上得到的是标签的最后一个版本,它被添加一次,这是预期的行为。

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