我正在尝试使用传递的自定义参数动态创建自定义事件处理程序。基本上,我有一个添加了点击事件的面板:
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'方法而不是让我创建一个同名的新'私有对象'方法...我完全糊涂了!任何帮助将不胜感激!
答案 0 :(得分:1)
(sender,e)参数不会自动传递给您的PreviewAward方法。
它们被传递给你的lambda,在你的lambda中你只是不使用它们,并用一个字符串参数手动调用PreviewAward。
有几种方法可以解决这个问题,但最简单的方法就是稍微修改一下lambda,以便将所需的参数传递给PreviewAward方法。
awardButton.Click += (sender, e) => PreviewAward(sender, e, dtAward.Rows[0]["iconImage"].ToString());
编辑:也就是说,拥有一个需要额外参数的点击事件处理程序是一种奇怪的设计 - 这意味着该方法的签名与EventHandler签名不匹配。例如,可能值得重新考虑设计,以便在方法内部计算第三个参数。