0

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

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”方法,而不是让我创建一个新的同名“私有对象”方法……我完全糊涂了!任何帮助将非常感激!

4

1 回答 1

1

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

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

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

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

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

于 2013-03-12T16:03:05.843 回答