需要帮助-动态点击带有自定义参数的EventHandler - Lambda表达式
本文关键字:参数 自定义 EventHandler Lambda 表达式 帮助 动态 | 更新日期: 2023-09-27 18:03:27
我试图动态创建一个自定义事件处理程序与自定义参数通过。基本上,我有一个带有click事件的面板:
Panel awardButton = new Panel();
awardButton.Click += new EventHandler(PreviewAward);
我想发送一些变量到我的previeward函数。我试了我所知道的一切,但除了错误什么也没得到。我试着寻找帮助,这是我能找到的最近的:
带有自定义参数的eventandler
我试着这样使用代码:
awardButton.Click += (sender, e) => PreviewAward(dtAward.Rows[0]["iconImage"].ToString());
lambda右边的所有内容都用红色下划线表示"没有重载方法' previeward '接受1个参数"。我想我不明白lambda是如何工作的,因为我认为(sender, e)被传递到previeward方法以及我的"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右侧的函数上时,我会看到' previeward '上的一个小下拉框,它希望我创建一个方法存根。如果我点击它,它会创建这个:
private object PreviewAward(string p)
{
throw new NotImplementedException();
}
我不知道该怎么做,特别是它没有我的"发件人"在它。我的印象是它会使用我已经创建的"private void previeward"方法,而不是让我创建一个同名的新"private object"方法……我彻底糊涂了!任何帮助将非常感激!
(sender, e)参数不会自动传递给previeward方法。
它们被传递给你的lambda,在你的lambda中你根本不使用它们,而是用一个字符串参数手动调用previeward。
有几种方法可以解决这个问题,但最简单的方法是稍微修改一下lambda,以便它将所需的参数传递给previeward方法。
awardButton.Click += (sender, e) => PreviewAward(sender, e, dtAward.Rows[0]["iconImage"].ToString());
编辑:这是一个有点奇怪的设计,有一个点击事件处理程序,需要一个额外的参数-这意味着方法的签名不匹配EventHandler签名。可能需要重新考虑一下设计,以便在方法内部计算第三个参数,例如