1: 手动清空某个控件下某个事件注册的委托
2: 手动执行控件某个事件下的所有委托
/// <summary>
/// 清空控件指定事件下的事件处理方法
/// </summary>
/// <param name="control"></param>
/// <param name="eventname"></param>
public static void ClearEvent(this Control control, string eventname)
{
var InvocationList = control.GetEventInvocationList(eventname);
if (InvocationList == null)
return;
Type controlType = control.GetType();
EventInfo eventInfo = controlType.GetEvent(eventname);
foreach (Delegate dx in InvocationList)
eventInfo.RemoveEventHandler(control, dx);
}
/// <summary>
/// 手动触发控件的指定事件
/// </summary>
/// <param name="control"></param>
/// <param name="eventname"></param>
/// <param name="e">事件参数,一般第一个参数sender默认为控件,所以就省略了,只需要传第二个参数</param>
public static void TriggerEvent(this Control control, string eventname, object e)
{
var InvocationList = control.GetEventInvocationList(eventname);
if (InvocationList == null)
return;
foreach (Delegate dx in InvocationList)
dx.DynamicInvoke(control, e);
}
/// <summary>
/// 获取指定事件的委托
/// </summary>
/// <param name="control"></param>
/// <param name="eventname"></param>
/// <returns></returns>
public static Delegate[] GetEventInvocationList(this Control control, string eventname)
{
if (control == null) return null;
if (string.IsNullOrEmpty(eventname)) return null;
BindingFlags mPropertyFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.IgnoreCase;
BindingFlags mFieldFlags = BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.IgnoreCase;
Type controlType = control.GetType();
PropertyInfo propertyInfo = controlType.GetProperty("Events", mPropertyFlags);
EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(control, null);
FieldInfo fieldInfo = controlType.GetField("Event" + eventname, mFieldFlags);
if (fieldInfo == null) fieldInfo = controlType.GetField("Event_" + controlType.Name + eventname, mFieldFlags);//有的控件时需要加上控件类型名作为事件名,
if (fieldInfo == null) fieldInfo = controlType.GetField(eventname, mFieldFlags);//也许有的不需要加前缀
//有些事件是继承自 Control ,控件 Type 下没有,比如 ListBox ,所以要从 Control 下找
if (fieldInfo == null) fieldInfo = typeof(Control).GetField("Event" + eventname, mFieldFlags);
if (fieldInfo == null) fieldInfo = typeof(Control).GetField("Event_" + controlType.Name + eventname, mFieldFlags);//有的控件时需要加上控件类型名作为事件名,
if (fieldInfo == null) fieldInfo = typeof(Control).GetField(eventname, mFieldFlags);//也许有的不需要加前缀
if (fieldInfo == null) return null;
Delegate d = eventHandlerList[fieldInfo.GetValue(control)];
if (d == null) return null;
return d.GetInvocationList();
}