C# C ClickEvent-覆盖上一个处理程序

C# C ClickEvent-覆盖上一个处理程序,c#,event-handling,C#,Event Handling,我有一个只需点击一个按钮就可以运行的方法 这些方法进入数据库并返回所有匹配的产品idslist 一个特定的关键字。 然后,它使用该id从数据库中获取相应的图像 并将其添加到picturebox中。 我遇到的问题是将click evethandler添加到每个picturebox。如果我再次单击搜索按钮,现在有两个eventhndler注册到该picturebox,以此类推。所以,当我点击一个picurebox,然后按两次搜索按钮,我就会看到两个messagebox 有没有办法删除以前的事件处理程

我有一个只需点击一个按钮就可以运行的方法

这些方法进入数据库并返回所有匹配的产品idslist 一个特定的关键字。 然后,它使用该id从数据库中获取相应的图像 并将其添加到picturebox中。 我遇到的问题是将click evethandler添加到每个picturebox。如果我再次单击搜索按钮,现在有两个eventhndler注册到该picturebox,以此类推。所以,当我点击一个picurebox,然后按两次搜索按钮,我就会看到两个messagebox

有没有办法删除以前的事件处理程序而只保留最新的事件处理程序

private void btnSearch_Click(object sender, EventArgs e)
    {
        ClearPicBoxs();

        if((!txtBoxSearch.Text.Equals("Search...") || !txtBoxSearch.Text.Equals("")) && isLoggedIn)
        {
            //Get Product ids from database which have supplied keyword
            DAOKeyword.SelectKeywords(txtBoxSearch.Text, productIdsList);

            int cnt = 0;

            foreach (int productId in productIdsList)
            {
                ImageDAOImpl DAOIamge = new ImageDAOImpl();

                picPrd = pictureBoxList[cnt];
                picPrd.Text = productId.ToString();
                picPrd.Click += new System.EventHandler((sender1, e1) => picPrd_Click(sender, e, productId));

                picPrd.Image = ByteArrayToImagebyMemoryStream(DAOIamge.SelectImage(productId));
                picPrd.SizeMode = PictureBoxSizeMode.StretchImage;
                picPrd.Refresh();
                cnt++;
            }
            lblLatest_Search.Text = "''" + txtBoxSearch.Text + "''";
            productIdsList.Clear(); 
        }   
        else
        {
            //Select Latest Posted Products
        }
    }



private void picPrd_Click(object sender, EventArgs e, int productId)
        {
            //Use productId to get info about product
            MessageBox.Show(productId.ToString());
        }

我不知道列表pictureBoxList填充在哪里,也不知道为什么只要手动设置控件属性,就需要将其项分配给控件

如果每次在分配事件处理程序之前都重新实例化该控件,那么它应该只触发一次 我的建议是替换下面的行

 picPrd = pictureBoxList[cnt];
 picPrd = new PictureBox();
用下线

 picPrd = pictureBoxList[cnt];
 picPrd = new PictureBox();

为什么要再次添加eventhandler?只需执行一次。只需添加一次EventHandler,例如在ctor中