需要帮助 - 动态单击带有自定义参数的EventHandler - Lambda Expression

时间:2013-03-12 15:52:11

标签: c# lambda event-handling

我正在尝试使用传递的自定义参数动态创建自定义事件处理程序。基本上,我有一个添加了点击事件的面板:

Panel awardButton = new Panel();
awardButton.Click += new EventHandler(PreviewAward);

我想向PreviewAward函数发送一些变量。我尝试了所有我知道但除了错误之外什么都没有。我试着寻求帮助,这是我能找到的最接近的地方:

EventHandler with custom arguments

我尝试使用该代码如下:

awardButton.Click += (sender, e) => PreviewAward(dtAward.Rows[0]["iconImage"].ToString());

lambda右侧的所有内容都用红色加下划线说“方法没有重载'PreviewAward'需要1个参数”。我想我不理解lambda是如何工作的,因为我认为(发送者,e)被传递到PreviewAward方法以及我的“iconImage”字符串,总共产生3个参数,而不是一个。此外,我尝试将变量添加到我的方法,但得到相同的错误。这是方法:

    private void PreviewAward(object sender, EventArgs e, string slot)
    {
        string str = ((Panel)sender).Name;
        MemoryStream ms = new MemoryStream(Utils.StrToByteArray(str));
        MemoryStream preview = new MemoryStream(Utils.ImageMerge(((System.Drawing.Image)(Avatar.Properties.Resources.resizeButtonIn)), Image.FromStream(ms), 200, 200));
        Debug.Print("Show Preview for item: " + str);
    }

当我鼠标悬停在lambda右侧的函数上时,我得到了'PreviewAward'上的小下拉,它希望我创建一个方法存根。如果我点击它,它会创建:

    private object PreviewAward(string p)
    {
        throw new NotImplementedException();
    }

我不知道该怎么做,特别是因为它没有我的'发件人'。我的印象是它会使用我已经创建的'private void PreviewAward'方法而不是让我创建一个同名的新'私有对象'方法...我完全糊涂了!任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

(sender,e)参数不会自动传递给您的PreviewAward方法。

它们被传递给你的lambda,在你的lambda中你只是不使用它们,并用一个字符串参数手动调用PreviewAward。

有几种方法可以解决这个问题,但最简单的方法就是稍微修改一下lambda,以便将所需的参数传递给PreviewAward方法。

awardButton.Click += (sender, e) => PreviewAward(sender, e, dtAward.Rows[0]["iconImage"].ToString());

编辑:也就是说,拥有一个需要额外参数的点击事件处理程序是一种奇怪的设计 - 这意味着该方法的签名与EventHandler签名不匹配。例如,可能值得重新考虑设计,以便在方法内部计算第三个参数。