Удалить обработчик событий с кодом - PullRequest
0 голосов
/ 13 августа 2011

Обработчик события можно удалить с помощью следующего кода в событии нажатия кнопки.

Button btn = new Button();
this.Controls.Add(btn);
btn.Click += (o, x) =>
{
    Button b = o as Button;
    FieldInfo eventclick = typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
    object eventValue = eventclick.GetValue(b);
    PropertyInfo events = b.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
    EventHandlerList eventHandlerList = (EventHandlerList)events.GetValue(b, null);
    eventHandlerList .RemoveHandler(eventValue, eventHandlerList [eventValue]);
    MessageBox.Show("Test");
};

Но я хочу удалить обработчик события из события vgridcontrols CellValueChanged.Что я должен написать для «EventClick» в следующем?

FieldInfo eventclick = typeof(Control).GetField(
    "EventClick",
    BindingFlags.Static | BindingFlags.NonPublic);

Ответы [ 2 ]

4 голосов
/ 13 августа 2011

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

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

Непонятно, что вы подразумеваете под "vgridcontrols" (DataGridView?), Но какое бы решение вы ни предложили, оно будет зависеть от реализации - и эта реализация может легко измениться в следующей версии, какой бы она ни была.

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

0 голосов
/ 19 июня 2013

Это VB.NET, но вы можете легко изменить его на C #.Это то, что вы хотите:

'Remove the handler from the cell value changed
Dim gv As DataGridView = Me.equipmentGridView
Dim fInf As FieldInfo = GetType(DataGridView).GetField("EVENT_DATAGRIDVIEWCELLVALUECHANGED", BindingFlags.Static Or BindingFlags.NonPublic)
Dim del As Object = fInf.GetValue(gv)
Dim pInf As PropertyInfo = gv.GetType().GetProperty("Events", BindingFlags.NonPublic Or BindingFlags.Instance)
Dim evList As EventHandlerList = pInf.GetValue(gv, Nothing)
evList.RemoveHandler(del, evList(del))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...