Как я могу удалить событие? - PullRequest
0 голосов
/ 31 июля 2011

Я добавляю подобное событие

Button button = new Button();

button.Click += (o,e) =>
{
//Somecode
};

Как удалить это событие?

Ответы [ 4 ]

7 голосов
/ 31 июля 2011

Правильный синтаксис:

button.Click += (o, e) => {  /*code*/ };

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

Если вы сохраняете лямбду в качестве делегата:

EventHandler<EventArgs> handler = (o, e) => {  //code };

Вы можете добавить / удалить его:

button.Click += handler;
button.Click -= handler;

Однако я настоятельно советую против этого. Вместо этого используйте именованный метод.

1 голос
/ 31 июля 2011

Вы можете сделать это, если сохраните делегата.

Button button=new Button();

EventHandler<...> handler=(o,e)=>
{
//Somecode
}

button.Click+=handler;
button.Click-=handler;

Но я рекомендую использовать именованный метод. Я не вижу здесь никакой пользы от использования лямбды.

1 голос
/ 31 июля 2011

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

button.Click += OnButtonClick;

private void OnButtonClick(object sender, EventArgs e)
{
    //some code
} 
0 голосов
/ 31 июля 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");
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...