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

时间:2014-12-01 10:31:50

标签: c# event-handling

我有一个方法只需点击一下按钮即可运行。

  • 这些方法转到数据库并返回匹配的所有产品ID(列表) 一个特定的关键字。
  • 然后使用该id从数据库中获取相应的图像 并将其添加到图片框中。

我遇到的问题是将click evethandler添加到每个图片框中。如果我第二次单击搜索按钮,现在有两个eventhndler注册到该图片框,依此类推。因此,当我按下两次搜索按钮后点击图片盒时,我会点击两个消息框。

有没有办法放弃前一个并且只保留最新的事件处理程序?

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());
        }

1 个答案:

答案 0 :(得分:0)

我不确定列表pictureBoxList的填充位置,以及为什么只要手动设置控件属性就需要将其项目分配给控件。

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

 picPrd = pictureBoxList[cnt];

使用以下行

 picPrd = new PictureBox();