Удалить 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);
}