带有自定义参数的EventHandler

时间:2011-06-23 16:29:12

标签: c# event-handling click contextmenu

我一直在寻找谷歌上大约一个小时的答案,但我找不到我正在寻找的答案。

基本上,我有一个静态助手类,它可以帮助我在我的应用程序中经常执行许多操作。在这种情况下,我有一个名为“CreateDataContextMenu”的方法,它在给定的TreeView控件上创建一个上下文菜单。

public static void CreateDataContextMenu(Form parent, TreeView owner, string dataType)
{ ... }

TreeView所有者是我将关联我的上下文菜单的控件。

然后我将Click事件添加到MenuItem,如下所示:

menuItemFolder.Click += new System.EventHandler(menuItemFolder_Click);

我在这里遇到的问题是我想将“owner”和“dataType”作为参数传递给menuItemFolder_Click事件。

我尝试了以下内容:

menuItemFolder.Click += new System.EventHandler(menuItemFolder_Click(sender,e,owner,dataType));
(...)
private static void menuItemFolder_Click(object sender, System.EventArgs e, Treeview owner, string dataType)
{...}

但它根本不起作用。我这样做可能很天真,但我对事件处理程序还不太满意。

关于我如何做到这一点的任何想法? 我的第一个猜测是我需要为这个特定情况创建自己的EventHandler。我是否正朝着正确的方向前进?

4 个答案:

答案 0 :(得分:40)

您应该创建一个lambda expression来调用带有额外参数的方法:

menuItemFolder.Click += (sender, e) => YourMethod(owner, dataType);

答案 1 :(得分:0)

前面诚实的录取:我没有尝试过下面的代码。

我认为原因

menuItemFolder.Click += new System.EventHandler(menuItemFolder_Click(sender,e,owner,dataType));

将无法工作是因为您实际上传递给System.EventHandler()调用menuItemFolder_Click()的结果与提供的参数。您没有传递指向函数本身的指针。

尝试编写另一个实现menuItemFolder_Click()细节的函数。看看是否像

private void menuItemFolder_Click_Helper (object sender, EventArgs e, object Owner, object DataType) {
// implement details here
}

然后从menuItemFolder_Click()中调用该函数。

答案 2 :(得分:0)

我认为最简单的代码是:

    EventHandler myEvent = (sender, e) => MyMethod(myParameter);//my delegate

    myButton.Click += myEvent;//suscribe

    private void MyMethod(MyParameterType myParameter)
    {
     //Do something 

     //if only one time
     myButton.Click -= myEvent;//unsuscribe
    }

答案 3 :(得分:0)

将自定义参数传递给事件处理程序并不太困难。下面是一种干净且易于重复使用的方法。检查一下:

public class MyClass
{
    public CustomArgsEventHandler MyEvent1;
    public MyClass(){MyEvent1+=observer;}
    public void observer(object sender, CustomEventArgs e){print(e.myArg);}
    //...
}

//place in the same file if you like!
public class CustomEventArgs : EventArgs
{
    public float myArg {get;set;}
    public CustomEventArgs (float d) { myArg = d; }
}
public delegate void CustomArgsEventHandler (object sender, CustomEventArgs e);