带有自定义参数的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 }