代码之家  ›  专栏  ›  技术社区  ›  Thomas

PaintEventHandler逻辑问题

  •  1
  • Thomas  · 技术社区  · 14 年前

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

    // 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);
    

    但是当我编译并运行代码时,它不会在picturebox上画出任何序列号。

    分辨率:

    谢谢你的帮助。我改变了你的想法

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

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

    这样一来,绘制事件就看不到局部变量了。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Fredrik Mörk    14 年前

    这是因为您在循环中反复使用字符串字段,更新其值,直到循环完成,最后一个值将出现在字段中:

    //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));