EventHandler с настраиваемыми аргументами

Я искал ответ около часа в Google, но я не нашел точно, что я ищу.

В принципе, у меня есть статический класс Helper, который помогает выполнять многие вещи, которые я часто делаю в своем приложении. В этом случае у меня есть метод под названием "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 для этого конкретного случая. Я иду в правильном направлении с этим?

Ответ 1

Вам следует создать выражение lambda, которое вызывает метод с дополнительными параметрами:

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

Ответ 2

Честный вход впереди: я не пробовал код ниже.

Я думаю, что причина

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().

Ответ 3

Я думаю, самый простой код:

    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
    }