我正在添加类似的事件
Button button = new Button();
button.Click += (o,e) =>
{
//Somecode
};
如何删除此事件?
答案 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");
};