我正在动态创建一些图片框,然后分配以下内容:
// 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事件无法看到局部变量。
答案 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));