在网上找到 void ClearEvent(Control control, string eventname)
        {
            if (control == null) return;
            if (string.IsNullOrEmpty(eventname)) return;            BindingFlags mPropertyFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static |   BindingFlags.NonPublic;
            BindingFlags mFieldFlags = BindingFlags.Static | BindingFlags.NonPublic;
            Type controlType = typeof(System.Windows.Forms.Control);
            PropertyInfo propertyInfo = controlType.GetProperty("Events", mPropertyFlags);
            EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(control, null);
            FieldInfo fieldInfo = (typeof(Control)).GetField("Event" + eventname, mFieldFlags);
            Delegate d = eventHandlerList[fieldInfo.GetValue(control)];            if (d == null) return;
            EventInfo eventInfo=controlType.GetEvent(eventname);            foreach (Delegate dx in d.GetInvocationList())
                eventInfo.RemoveEventHandler(control, dx);        }调用案例:ClearEvent(button1,"Click");//就会清除button1对象的Click事件的所有挂接事件。    测试了一下是好用的.但是我想删除DataGridView控件的CellContentClick事件.怎样传值才能让fieldInfo不等于null.类似源码那样写 ClearEvent(dgvDes,'CellContentClick')是不好用的.

解决方案 »

  1.   

    "Event" + eventname是什么,CellContentClick中那里有Event字样
      

  2.   


    应该是EventDataGridView?我有试过啊,还是null.有人说DataGridView事件都要用"Event_"+"DataGridView"+eventname.同样试过,求帮助.纠结一下午了
      

  3.   

    你的是什么情况,非要用这种方法取消事件;
    -=不能满足需求嚒;
    你这个代码,我以前用过,就是'CellContentClick'没写对,有时候里面的名字不一定就是事件的全拼;
    你可以试一下其写法;比如‘OnCellContentClick’ 主要里面那个委托你看不到,谁晓得当初人家写的啥。。
      

  4.   

    你要用反射看看控件的EventName对不对
      

  5.   

            private void ClearEvent(Control control, string eventname)
            {
                if (control == null) return;
                if (string.IsNullOrEmpty(eventname)) return;
                BindingFlags mPropertyFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase |BindingFlags.Static;
                BindingFlags mFieldFlags = BindingFlags.Static | BindingFlags.NonPublic;
                Type controlType = control.GetType();
                PropertyInfo propertyInfo = controlType.GetProperty("Events", mPropertyFlags);
                EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(control, null);
                String name  = "Event" + eventname;
                FieldInfo fieldInfo = controlType.GetField(name, mFieldFlags);
                if (fieldInfo == null)
                {
                    name = "Event_" + controlType.Name + eventname;
                    fieldInfo = controlType.GetField(name, mFieldFlags);
                    if (fieldInfo == null)
                    {
                        name = name.ToUpper();
                        fieldInfo = controlType.GetField(name, mFieldFlags);
                    }
                }
                Delegate d = eventHandlerList[fieldInfo.GetValue(control)];            if (d == null) return;
                EventInfo eventInfo = controlType.GetEvent(eventname);            foreach (Delegate dx in d.GetInvocationList())
                    eventInfo.RemoveEventHandler(control, dx);        }
      

  6.   

    不知道是不是所有的都可以删除,但是DataGridView的CellContentClick是好用的.谢谢.