PaintEventHandler逻辑问题

时间:2010-06-15 13:23:37

标签: c# winforms

我正在动态创建一些图片框,然后分配以下内容:

// class variable
public String PaintLabel;

// private void Form2_Load(object sender, EventArgs e)

//begin loop
this.PaintLabel = serialno;
Shapes[i].Paint += new PaintEventHandler(ctl_Paint);
// end loop

// my event override
private void ctl_Paint(object sender, PaintEventArgs e)
{
    Control tmp = (Control)sender;

    using (Font myFont = new Font("Arial", 9, FontStyle.Bold))
    {
        e.Graphics.DrawString(this.PaintLabel, myFont, Brushes.LightYellow, new Point(62, 2));
    } // using (Font myFont = new Font("Arial", 10))
} // private void ctl_Paint(object sender, EventArgs e)

应该创建图片框并在每个图片框上写一个不同的序列号。 但它最终会写出所有图片框上的最后一个序列号

编辑:

好的,你的解决方案非常先进。但我试图理解它。

我已将您的代码添加到我的。

然后按照以下方式更改了我的图片框数组

MyControl[] Shapes = new MyControl[Num_Picbox];

在我的循环中,我做了以下

Shapes[i].SerialNumber = serialno;
Shapes[i].Paint += new PaintEventHandler(ctl_Paint);

但是当我编译并运行代码时,它不会在图片框上绘制任何序列号。

解决方案:

感谢您的帮助。我改变了你的

var PaintLabels = new Dictionary<Control, string>();

Dictionary<Control, string> PaintLabels = new Dictionary<Control, string>();

将其整理出来,paint事件无法看到局部变量。

1 个答案:

答案 0 :(得分:1)

这是因为你在循环中一遍又一遍地使用字符串字段,更新它的值,直到完成循环,最后一个值将在字段中:

//begin loop
// *** here is your problem; there is only one PaintLabel ***
this.PaintLabel = serialno;
Shapes[i].Paint += new PaintEventHandler(ctl_Paint);
// end loop

一种解决方案是将PaintLabel放入一个数组中,其元素与形状一样多。或者更简单的是,创建一个Dictionary,它还包含形状和序列号之间的引用:

var PaintLabels = new Dictionary<Control, string>();

//begin loop
PaintLabels.Add(Shapes[i], serialno);
Shapes[i].Paint += new PaintEventHandler(ctl_Paint);
// end loop


// in the paint event
e.Graphics.DrawString(PaintLabel[tmp], myFont, Brushes.LightYellow, new Point(62, 2));