【发布时间】:2020-09-17 12:48:08
【问题描述】:
我有 6 个ellipse 和 6 个label。我想在ellipse 上添加labels。 labels 中的 2 个可以,但其他的不行。
在调试模式下没有错误。
代码如下:
private void Form1_Paint(object sender, PaintEventArgs e)
{
int locY = 200, locX = 10, i = 0;
for (int k = 0; k < 3; k++)
{
locX += 40;
for (int j = 0; j < 2; j++)
{
locY += 30;
Pen pen = new Pen(Color.Red, 10);
e.Graphics.DrawEllipse(pen, new Rectangle(locX, locY, 10, 10));
Label label = new Label();
label.Text = i.ToString();
label.Location = new Point(locX,locY);
label.BackColor = Color.Transparent;
Controls.Add(label);
i++;
}
locY = 200;
}
}
这是输出:
【问题讨论】:
-
1) 你真的不应该在 Paint 事件中创建任何控件,尤其是。因为您无法控制何时以及多久调用一次。 2)当你可以简单地画出文本时为什么要使用标签?
-
所以你说我需要在
Form1_Load事件中创建这些标签,对吧?这是一个例子,我想创建用户想要多少的标签。 -
同意@TaW。每次绘制屏幕时,您将创建 6 个标签,它们的生命周期绑定到最里面的
for循环。随着每个循环的完成,您刚刚创建的标签将有资格进行垃圾收集(请记住,在发布代码中的行为与在调试代码中的行为不同)。您永远不会处理它们,因此您的进程句柄数会不断增加。 -
何时创建它们并不重要,但您需要确保只创建一次。您的代码无法控制它!您可以将其放入 if 块中,以测试它们是否已经存在。提示:将此行添加到您的绘制代码的末尾:
Console.WriteLine(this.Controls.Count + " controls so far."); -
但是,您可以只绘制文本,大致与绘制椭圆的方式相同。跟踪你想在每个圆圈中画什么,当油漆到来时,画椭圆,然后在上面画文字