我一直在寻找谷歌上大约一个小时的答案,但我找不到我正在寻找的答案。
基本上,我有一个静态助手类,它可以帮助我在我的应用程序中经常执行许多操作。在这种情况下,我有一个名为“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。我是否正朝着正确的方向前进?
答案 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);