EventHandler с пользовательскими аргументами


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

В принципе, у меня есть статический вспомогательный класс, который помогает выполнять многие вещи, которые я часто делаю в своем приложении. В этом случае у меня есть метод с именем "CreateDataContextMenu", который создает контекстное меню для данного элемента управления TreeView.

public static void CreateDataContextMenu(Form parent, TreeView owner, string dataType)
{ ... }

TreeView owner-это элемент управления, с которым я буду связывать свое контекстное меню.

Затем позже я добавляю событие 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 10

3 ответа:

Необходимо создать лямбда-выражение, вызывающее метод с дополнительными параметрами:

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

Честное признание: Я не пробовал код ниже.

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

menuItemFolder.Click += new System.EventHandler(menuItemFolder_Click(sender,e,owner,dataType));

Не будет работать, потому что вы на самом деле переходите к системе.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
    }