带有自定义参数的EventHandler

我一直在寻找谷歌大约一个小时的答案,但我没有找到我正在寻找的确切内容。

基本上,我有一个静态助手类,可以帮助我在我的应用程序中经常执行许多操作。 在这种情况下,我有一个名为“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。 我是否朝着正确的方向前进?

您应该创建一个lambda表达式 ,该表达式使用额外的参数调用方法:

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

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

我想原因

 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()中调用该函数。

我认为最简单的代码是这样的:

  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 }