Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在多椭圆上创建多个标签_C#_Label_Controls_Ellipse - Fatal编程技术网

C# 在多椭圆上创建多个标签

C# 在多椭圆上创建多个标签,c#,label,controls,ellipse,C#,Label,Controls,Ellipse,我有6个椭圆和6个标签。我想在椭圆上添加标签s。标签s中的2个正常,但其他的不正常 在调试模式下没有错误 代码如下: private void Form1_Paint(object sender, PaintEventArgs e) { int locY = 200, locX = 10, i = 0; for (int k = 0; k < 3; k++) { locX

我有6个椭圆和6个标签。我想在
椭圆上添加
标签
s。标签
s中的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;
            }
        }
private void Form1\u Paint(对象发送方,PaintEventArgs e)
{
int-locY=200,locX=10,i=0;
对于(int k=0;k<3;k++)
{
locX+=40;
对于(int j=0;j<2;j++)
{
locY+=30;
钢笔=新钢笔(颜色:红色,10);
e、 图形学.抽屉(钢笔,新矩形(locX,locY,10,10));
标签=新标签();
label.Text=i.ToString();
标签位置=新点(locX、locY);
label.BackColor=Color.Transparent;
控件。添加(标签);
i++;
}
locY=200;
}
}
以下是输出:


您还应该在循环外部创建该笔,并确保将其丢弃

下面是一个使用DrawString()的示例,如注释中所述:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    StringFormat sf = new StringFormat();
    sf.Alignment = StringAlignment.Center;
    sf.LineAlignment = StringAlignment.Center;

    int locY = 200, locX = 10, i = 0;
    using (Pen pen = new Pen(Color.Red, 10))
    {               
        for (int k = 0; k < 3; k++)
        {
            locX += 40;
            for (int j = 0; j < 2; j++)
            {
                locY += 30;
                Rectangle rc = new Rectangle(locX, locY, 10, 10);
                e.Graphics.DrawEllipse(pen, rc);

                SizeF szF = e.Graphics.MeasureString(i.ToString(), this.Font);
                Rectangle rc2 = new Rectangle(new Point(rc.Left + rc.Width / 2, rc.Top + rc.Height / 2), new Size(1, 1));
                rc2.Inflate((int)szF.Width, (int)szF.Height);
                e.Graphics.DrawString(i.ToString(), this.Font, Brushes.Black, rc2, sf);

                i++;
            }
            locY = 200;
        }
    }
}
private void Form1\u Paint(对象发送方,PaintEventArgs e)
{
StringFormat sf=新的StringFormat();
sf.Alignment=StringAlignment.Center;
sf.LineAlignment=StringAlignment.Center;
int-locY=200,locX=10,i=0;
使用(钢笔=新钢笔(颜色:红色,10))
{               
对于(int k=0;k<3;k++)
{
locX+=40;
对于(int j=0;j<2;j++)
{
locY+=30;
矩形rc=新矩形(locX,locY,10,10);
e、 图形学.抽屉(钢笔,rc);
SizeF szF=e.Graphics.MeasureString(即ToString(),this.Font);
矩形rc2=新矩形(新点(rc.Left+rc.Width/2,rc.Top+rc.Height/2),新尺寸(1,1));
rc2.充气((内部)szF.宽度,(内部)szF.高度);
e、 Graphics.DrawString(i.ToString(),this.Font,brush.Black,rc2,sf);
i++;
}
locY=200;
}
}
}

您还应该在循环外部创建该笔,并确保将其丢弃

下面是一个使用DrawString()的示例,如注释中所述:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    StringFormat sf = new StringFormat();
    sf.Alignment = StringAlignment.Center;
    sf.LineAlignment = StringAlignment.Center;

    int locY = 200, locX = 10, i = 0;
    using (Pen pen = new Pen(Color.Red, 10))
    {               
        for (int k = 0; k < 3; k++)
        {
            locX += 40;
            for (int j = 0; j < 2; j++)
            {
                locY += 30;
                Rectangle rc = new Rectangle(locX, locY, 10, 10);
                e.Graphics.DrawEllipse(pen, rc);

                SizeF szF = e.Graphics.MeasureString(i.ToString(), this.Font);
                Rectangle rc2 = new Rectangle(new Point(rc.Left + rc.Width / 2, rc.Top + rc.Height / 2), new Size(1, 1));
                rc2.Inflate((int)szF.Width, (int)szF.Height);
                e.Graphics.DrawString(i.ToString(), this.Font, Brushes.Black, rc2, sf);

                i++;
            }
            locY = 200;
        }
    }
}
private void Form1\u Paint(对象发送方,PaintEventArgs e)
{
StringFormat sf=新的StringFormat();
sf.Alignment=StringAlignment.Center;
sf.LineAlignment=StringAlignment.Center;
int-locY=200,locX=10,i=0;
使用(钢笔=新钢笔(颜色:红色,10))
{               
对于(int k=0;k<3;k++)
{
locX+=40;
对于(int j=0;j<2;j++)
{
locY+=30;
矩形rc=新矩形(locX,locY,10,10);
e、 图形学.抽屉(钢笔,rc);
SizeF szF=e.Graphics.MeasureString(即ToString(),this.Font);
矩形rc2=新矩形(新点(rc.Left+rc.Width/2,rc.Top+rc.Height/2),新尺寸(1,1));
rc2.充气((内部)szF.宽度,(内部)szF.高度);
e、 Graphics.DrawString(i.ToString(),this.Font,brush.Black,rc2,sf);
i++;
}
locY=200;
}
}
}

1)确实不应该在绘制事件中创建任何控件,尤其是因为您无法控制何时以及多久调用一次。2) 当你可以简单地将文本拉长时,为什么要使用标签呢?所以你说我需要将这些标签创建到
Form1\u Load
事件中,对吗?这是一个例子,我想创建一个标签,表示用户需要多少。同意@TaW。每次绘制屏幕时,您将创建6个标签,其生存期绑定到最内层的
for
循环。当这些循环中的每一个循环完成时,您刚刚创建的标签将有资格进行垃圾收集(记住,垃圾收集在发布代码中的行为与在调试代码中的行为不同)。你永远不会处理它们,所以你的进程句柄数会一直增加。创建它们的时间并不重要,但你需要确保只创建一次。你的代码无法控制它!如果它们已经存在,您可以将其放入if块中进行测试。。提示:将这一行添加到绘制代码的末尾:
Console.WriteLine(this.Controls.Count+“Controls至今”)但是,您可以只绘制文本,大致与绘制椭圆的方式相同。跟踪要在每个圆中绘制的内容,绘制时,绘制椭圆,然后在顶部绘制文本1)您确实不应该在绘制事件内创建任何控件,尤其是因为您无法控制何时以及多久调用一次。2) 当你可以简单地将文本拉长时,为什么要使用标签呢?所以你说我需要将这些标签创建到
Form1\u Load
事件中,对吗?这是一个例子,我想创建一个标签,表示用户需要多少。同意@TaW。每次绘制屏幕时,您将创建6个标签,其生存期绑定到最内层的
for
循环。当这些循环中的每一个循环完成时,您刚刚创建的标签将有资格进行垃圾收集(记住,垃圾收集在发布代码中的行为与在调试代码中的行为不同)。你永远不会处理它们,所以你的进程句柄数会一直增加。创建它们的时间并不重要,但你需要确保只创建一次。你的代码无法控制它!如果它们已经存在,您可以将其放入if块中进行测试。。提示:将这一行添加到绘制代码的末尾:
Console.WriteLine(this.Controls.Count+“Controls至今”)但是,您可以只绘制文本,大致与绘制椭圆的方式相同。跟踪每个圆中要绘制的内容,在绘制时,绘制椭圆,然后绘制文本