单击循环中的事件处理程序

本文关键字:事件处理 程序 循环 单击 | 更新日期: 2023-09-27 18:02:07

我在for循环中调用了我的clickevent,但是当我点击我的在本例中,为了在新表单中打开它,click事件是重复多次,多个新表单不断打开

imagename= myRow["Photo"].ToString();
imagepath = imagename.Split(splitchar, StringSplitOptions.RemoveEmptyEntries);
 for (int j = 0; j <= imagepath.Length-1;j++ )
 { 
     if(imagepath[j]!=null){
         string imagefinals = paths + imagepath[j];
         pics[j].ImageLocation = imagefinals;
         pics[j].SizeMode = PictureBoxSizeMode.StretchImage;
         pics[j].Click += new System.EventHandler((s, ee) => LoadImage(s, e, imagefinals));
     }
 }
 return;

单击循环中的事件处理程序

在您从评论中输入之后,似乎您每次从数据库加载数据时都绑定了相同的事件处理程序,因此重复。

因为从你发布的代码看来,你事先知道你有多少PictureBoxes,你需要从数据绑定中分离事件处理程序绑定。

并且由于在每个PictureBoxImageLocation属性中已经有了imagefinals的值,因此不需要将其传递给LoadImage

相反,你的LoadImage方法应该看起来像这样(至少它的开头):
private void LoadImage(object sender, EventArgs e)
{
    var pictureBox = sender as PictureBox;
    if(pictureBox == null)
        return;
    var imageFinals = pictureBox.ImageLocation;
    // rest of the method here...
}
现在,假设您已经知道有多少个图片框,在您的FormLoad方法中绑定事件处理程序:
protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    foreach(var pb in pics)
        pb.Click += LoadImage;
}

否则,每当你添加一个新的PictureBox分配Click事件处理程序,但要确保它在一个方法中,而不是从你发布的代码调用。

下一步是从您发布的方法中删除单击事件处理程序绑定:

imagename= myRow["Photo"].ToString();
imagepath = imagename.Split(splitchar, StringSplitOptions.RemoveEmptyEntries);
for (int j = 0; j <= imagepath.Length-1;j++ )
{ 
    if(imagepath[j]!=null)
    {
        string imagefinals = paths + imagepath[j];
        pics[j].ImageLocation = imagefinals;
        pics[j].SizeMode = PictureBoxSizeMode.StretchImage;
    }
}
return;