我该如何删除活动?

时间:2011-07-31 11:26:23

标签: c# events

我正在添加类似的事件

Button button = new Button();

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

如何删除此事件?

4 个答案:

答案 0 :(得分:7)

正确的语法是

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

你不能删除它,因为它是一个不规则的方法(lambda)。如果您希望能够删除事件处理程序,则必须将代码移动到额外的方法。

如果将lambda保存为委托:

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

您可以添加/删除它:

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

但是,我强烈建议不要这样做。改为使用命名方法。

答案 1 :(得分:1)

简短的回答:你不能,你只能通过-=删除事件的处理程序。如果要删除处理程序,则不要使用匿名方法。而是使用预定义的方法,如:

button.Click += OnButtonClick;

private void OnButtonClick(object sender, EventArgs e)
{
    //some code
} 

答案 2 :(得分:1)

如果存储代理,则可以这样做。

Button button=new Button();

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

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

但我建议使用命名方法。我认为在这里使用lambda没有任何好处。

答案 3 :(得分:-1)

这可能会有所帮助;

        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");
        };