/// <summary>
/// 清除控件的事件
/// </summary>
/// <param name="objectHasEvents"></param>
/// <param name="EventFiledName"></param>
public static void ClearAllEvents(Control objectHasEvents, string EventFiledName)
{
if (objectHasEvents == null)
{
return;
}
EventInfo[] events = objectHasEvents.GetType().GetEvents(
BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.Instance);
if (events == null || events.Length < 1)
{
return;
}
for (int i = 0; i < events.Length; i++)
{
try
{
EventInfo ei = events[i];
/********************************************************
* class的每个event都对应了一个同名的private的delegate类
* 型成员变量(这点可以用Reflector证实)。因为private成
* 员变量无法在基类中进行修改,所以为了能够拿到base
* class中声明的事件,要从EventInfo的DeclaringType来获取
* event对应的成员变量的FieldInfo并进行修改
********************************************************/
//FieldInfo fi = ei.DeclaringType.GetField("EVENT_SELECTEDVALUECHANGED", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
FieldInfo fi = null;
if (EventFiledName == null)
fi = ei.DeclaringType.GetField(ei.Name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
else
fi = ei.DeclaringType.GetField(EventFiledName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
if (fi != null)
{
// 将event对应的字段设置成null即可清除所有挂钩在该event上的delegate
fi.SetValue(objectHasEvents, null);
}
}
catch
{
}
}
if (objectHasEvents is BizMagCardTextBox)
{
RemoveEvent(objectHasEvents, "EventEnter", "Enter");
RemoveEvent(objectHasEvents, "EventKeyPress", "KeyPress");
}
if (objectHasEvents is SDUnionICAndMagCard)
{
RemoveEvent(objectHasEvents, "EventEnter", "Enter");
}
if (objectHasEvents is BizComboBox)
{
RemoveEvent(objectHasEvents, "EVENT_SELECTEDINDEXCHANGED", "SelectedIndexChanged");
}
}
/// <summary>
/// 去掉指定控件的指定事件
/// </summary>
/// <param name="con">当前的控件</param>
/// <param name="eventName">事件名称</param>
/// <param name="infoName">对应的field名称</param>
public static void RemoveEvent(Control con, string eventName, string infoName)
{
try
{
BindingFlags mPropertyFlags = BindingFlags.Instance | BindingFlags.Public
| BindingFlags.Static | BindingFlags.NonPublic;//筛选
EventInfo[] events = con.GetType().GetEvents(mPropertyFlags);
Type type = typeof(Control);
PropertyInfo propertyInfo = type.GetProperty("Events", mPropertyFlags);
EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(con, null);//事件列表
foreach (EventInfo ei in events)
{
if (ei.Name.Equals(infoName))
{
FieldInfo fieldInfo = ei.DeclaringType.GetField(eventName, mPropertyFlags);
Delegate d = eventHandlerList[fieldInfo.GetValue(con)];//获得对应的事件委托
if (d == null) return;
foreach (Delegate dx in d.GetInvocationList())
{
ei.RemoveEventHandler(con, dx); //移除对应的事件
}
}
}
}
catch (Exception ex)
{ }
}