Удалить eventHandler, который был добавлен с помощью лямбда-выражения

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

Передать параметр в EventHandler

comboBox.DropDown += (sender, e) => populateComboBox(sender, e, dataSource, selectedItem);

Но это событие должно срабатывать только при первом выполнении условий, после чего оно должно быть удалено.

Делать это не работает:

comboBox.DropDown -= (sender, e) => populateComboBox(sender, e, dataSource, selectedItem);

Итак, вопрос в том, есть ли способ удалить этот метод?

Я видел это:

Как удалить все обработчики событий из элемента управления

Но я не могу заставить его работать для события ComboBox DropDown.

1 ответ

Решение

Проблема в том, что его не удаляют, потому что вы даете новое лямбда-выражение при его удалении. Вам нужно сохранить ссылку на делегат, созданный лямбда-выражением, чтобы удалить его из элемента управления.

EventHandler handler = (x, y) => comboBox1_DropDown(x, y);
comboBox1.DropDown += handler;

Это будет работать просто так:

comboBox1.DropDown -= handler;

через отражение:

    private void RemoveEvent(ComboBox b, EventHandler handler)
    {
        EventInfo f1 = typeof(ComboBox).GetEvent("DropDown");
        f1.RemoveEventHandler(b, handler);
    }
Другие вопросы по тегам