一个按钮绑定delegate:btn_Retrive.Click += new EventHandler(menuModifyParams_Click);
但是有可能绑定了多个menuModifyParams_Click
现在有两个问题:
(1)怎么判断btn_Retrive.Click已经绑定了menuModifyParams_Click?
(2)如何清除btn_Retrive.Click已经绑定delegate?
但是有可能绑定了多个menuModifyParams_Click
现在有两个问题:
(1)怎么判断btn_Retrive.Click已经绑定了menuModifyParams_Click?
(2)如何清除btn_Retrive.Click已经绑定delegate?
想问一下一个按钮的click事件绑定委托:btn_Retrive.Click += new EventHandler(menuModifyParams_Click); 请问如果获取btn_Retrive.Click绑定的函数对象menuModifyParams_Click
要判断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处理函数了
关于第二个问题,我想问得是:如何一次性清除所有的delegate?
如果没有的话,只有先获取所有的列表,再逐一清除啦
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;
}
}
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);