EventHandler с пользовательскими аргументами - PullRequest
11 голосов
/ 23 июня 2011

Я около часа искал ответ в 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 для этого конкретного случая. Я иду в правильном направлении с этим?

Ответы [ 3 ]

40 голосов
/ 23 июня 2011

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

menuItemFolder.Click += (sender, e) => YourMethod(owner, dataType);
0 голосов
/ 19 февраля 2018

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

    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
    }
0 голосов
/ 23 июня 2011

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

Я думаю причина

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

...