一个按钮绑定delegate:btn_Retrive.Click += new EventHandler(menuModifyParams_Click);
但是有可能绑定了多个menuModifyParams_Click
现在有两个问题:
(1)怎么判断btn_Retrive.Click已经绑定了menuModifyParams_Click?
(2)如何清除btn_Retrive.Click已经绑定delegate?

解决方案 »

  1.   

    还有一个问题:
    想问一下一个按钮的click事件绑定委托:btn_Retrive.Click += new EventHandler(menuModifyParams_Click);  请问如果获取btn_Retrive.Click绑定的函数对象menuModifyParams_Click
      

  2.   

    (1)
    要判断btn_Retrive.Click是否已经绑定了menuModifyParams_Click只能去btn_Retrive的EventHandlerList里面找事实上, C#的Control封装了EventHandlerList, 但它是protected的, 所以我们不能简单的看到它的存在, 不过, 如果你走Debug Mode的话, 还是可以看得很清楚的, 但如果真要把它拿出来用, 就只能用Reflect了PropertyInfo propertyInfo = (typeof(System.Windows.Forms.Button)).GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
    EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(btn_Retrive, null);
    FieldInfo fieldInfo = (typeof(Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
    Delegate d = eventHandlerList[fieldInfo.GetValue(null)];
    if (d != null)
    {
    foreach (Delegate temp in d.GetInvocationList())
    {
    Console.WriteLine(temp.Method.Name);
    }
    }
    上面的Code可以看到所有已经绑定了Click事件的代理函数, 通过简单的判断就可以知道是否已经绑定了menuModifyParams_Click(2)
    要清除已经绑定的代理, 可以这样:
    btn_Retrive.Click -= new EventHandler(menuModifyParams_Click); (3)
    要上面的Code里面, 已经可以找到你想要的menuModifyParams_Click处理函数了
      

  3.   

    谢谢,等下测试一下
    关于第二个问题,我想问得是:如何一次性清除所有的delegate?
    如果没有的话,只有先获取所有的列表,再逐一清除啦
      

  4.   

    清除用btn_Retrive.Click -= new EventHandler(menuModifyParams_Click);  检查的话遍历  EventHandlerList 然后加判断就可以了
      

  5.   

    LeoMaya 高人。方法真好。收藏了。
      

  6.   

    偷懒,改改leo的代码:PropertyInfo propertyInfo = (typeof(System.Windows.Forms.Button)).GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
                EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(btn_Retrive, null);
                FieldInfo fieldInfo = (typeof(Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
                Delegate d = eventHandlerList[fieldInfo.GetValue(null)];
                if (d != null)
                {
                    foreach (Delegate temp in d.GetInvocationList())
                    {
                              btn_Retrive -= temp;              
                    }
                }
      

  7.   

     PropertyInfo propertyInfo = (typeof(System.Windows.Forms.ComboBox)).GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
                    EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue((ComboBox)e.Control, null);
                    FieldInfo fieldInfo = (typeof(Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
                    Delegate d = eventHandlerList[fieldInfo.GetValue(null)];
                    if (d != null)
                    {
                        foreach (Delegate temp in d.GetInvocationList())
                        {
                            ((ComboBox)e.Control).SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged);
                        }
                    }
                    ((ComboBox)e.Control).SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged);
                    
      

  8.   

    我想对菜单项进行此操作,但是 d 一直为 null, 不知是否是 MenuItem 不支持。