单击循环中的事件处理程序
本文关键字:事件处理 程序 循环 单击 | 更新日期: 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
,你需要从数据绑定中分离事件处理程序绑定。
并且由于在每个PictureBox
的ImageLocation
属性中已经有了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;