http://bbs.csdn.net/topics/390663596?page=1#post-396282834

解决方案 »

  1.   

    楼上的回复足以结贴咯。试一下以下语句的效果:
     button13.Click-=new EventHandler(delegate{MessageBox.Show("1");});
      

  2.   

    button13.Click -= delegate{MessageBox.Show("1");};
      

  3.   

    不用匿名委托怎么写,又如何批量取消?定义一个委托(事件是一种特殊的委托),然后就可以+=和-=的操作了。如下:
     EventHandler pro;
                pro = (sender, e) =>
                {
                    //.......
                };
                button13.Click += pro;
    如果要批量删除,可以像你现在这样用匿名委托。通过反射遍历找到它的所有事件,Remove掉
      

  4.   

    看了,有点深奥,特别是这段代码PropertyInfo _PropertyInfo = p_Object.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
                if (_PropertyInfo != null)
                {
                    object _EventList = _PropertyInfo.GetValue(p_Object, null);
                    if (_EventList != null && _EventList is EventHandlerList)
                    {
                        EventHandlerList _List = (EventHandlerList)_EventList;
                        FieldInfo _FieldInfo = p_EventType.GetField(p_EventName, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
                        if (_FieldInfo == null) return null;
                        Delegate _ObjectDelegate = _List[_FieldInfo.GetValue(p_Object)];
                        if (_ObjectDelegate == null) return null;
                        return _ObjectDelegate.GetInvocationList();
                    }
                }
                return null;
      

  5.   

    特别是这些句子,有点云里雾里的感觉
    PropertyInfo
    object _EventList = _PropertyInfo.GetValue(p_Object, null);
    FieldInfo _FieldInfo = p_EventType.GetField(
    FieldInfo _FieldInfo = p_EventType.GetField(
    Delegate _ObjectDelegate = _List[_FieldInfo.GetValue(
      

  6.   

    看了,有点深奥,特别是这段代码PropertyInfo _PropertyInfo = p_Object.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
                if (_PropertyInfo != null)
                {
                    object _EventList = _PropertyInfo.GetValue(p_Object, null);
                    if (_EventList != null && _EventList is EventHandlerList)
                    {
                        EventHandlerList _List = (EventHandlerList)_EventList;
                        FieldInfo _FieldInfo = p_EventType.GetField(p_EventName, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
                        if (_FieldInfo == null) return null;
                        Delegate _ObjectDelegate = _List[_FieldInfo.GetValue(p_Object)];
                        if (_ObjectDelegate == null) return null;
                        return _ObjectDelegate.GetInvocationList();
                    }
                }
                return null;

    一个是反射,懂不懂?另一个涉及到WinForms的EventHandlerList机制,简单来说,因为对于控件来说,有大量的事件,为了减少存储提高性能,WinForms将它们全部存入一个列表,类似字典,这样绝大部分没有挂钩事件处理函数的事件就不要单独存储了。
    实在不理解,你就当黑盒直接用吧。