繁体   English   中英

需要帮助-具有自定义参数的动态Click EventHandler-Lambda表达式

[英]Need Help - Dynamic Click EventHandler with custom arguments - Lambda Expression

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

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

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

具有自定义参数的EventHandler

我尝试使用该代码,如下所示:

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

lambda右侧的所有内容都用红色下划线标出:“方法'PreviewAward'的重载不接受1个参数”。 我想我不理解lambda的工作原理,因为我认为(sender,e)与“ iconImage”字符串一起传递到PreviewAward方法中,使得总共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”方法,而不是让我创建一个同名的新“ private object”方法……我完全感到困惑! 任何帮助将非常感激!

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

它们被传递给您的lambda,而在您的lambda中,您根本就没有使用它们,而是使用单个字符串参数手动调用PreviewAward。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM