如何删除关闭事件?
How to remove Closing event?
我找到了一个很好的示例,说明如何从表单中删除所有 Click 事件:
private void RemoveClickEvent(Form c)
{
var f1 = typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
var obj = f1.GetValue(c);
var pi = c.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
var list = (EventHandlerList)pi.GetValue(c, null);
list.RemoveHandler(obj, list[obj]);
}
而且效果很好。但是,我需要的是删除 Closing 事件,但我不知道要写什么而不是 EventClick
才能使其正常工作。我试着写 EventClosing
、Closing
,但没有用。因此我的问题是:应该改变什么才能让它工作? 甚至更好 - 我想找到 所有可能输入的列表 因为我可能需要删除其他事件,例如 Closed
、FormClosing
、FormClosed
等
P.S。一个简单的 -=
是不可能的,因为可能会附加许多事件,其中许多事件我根本无法访问,因此我无论如何都无法删除它们。
如评论中所述,我列出了这些事件名称:
typeof(Form).GetFields(BindingFlags.NonPublic | BindingFlags.Static).AsEnumerable().ToList();
现在我有一个看起来像这样的方法:
public static class Utils
{
public static void DisableEvents<T>(this T ctrl, string officialName, string simplifiedName) where T : Control
{
var propertyInfo = ctrl.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
var eventHandlerList = propertyInfo.GetValue(ctrl, new object[] { }) as EventHandlerList;
var fieldInfo = typeof(T).GetField(officialName, BindingFlags.NonPublic | BindingFlags.Static);
var eventKey = fieldInfo.GetValue(ctrl);
var eventHandler = eventHandlerList[eventKey];
var invocationList = eventHandler.GetInvocationList();
foreach (var item in invocationList)
{
ctrl.GetType().GetEvent(simplifiedName).RemoveEventHandler(ctrl, item);
}
}
}
用法如下:
myForm.DisableEvents<Form>("EVENT_CLOSING", "Closing");
不幸的是,我还没有想出一种方法来将单个参数传递给我的方法。
根据前面的post,用法必须是这样的:
myForm.DisableEvents<Form>("EVENT_FORMCLOSING", "FormClosing");
myForm.DisableEvents<Form>("EVENT_FORMCLOSED", "FormClosed");
我找到了一个很好的示例,说明如何从表单中删除所有 Click 事件:
private void RemoveClickEvent(Form c)
{
var f1 = typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
var obj = f1.GetValue(c);
var pi = c.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
var list = (EventHandlerList)pi.GetValue(c, null);
list.RemoveHandler(obj, list[obj]);
}
而且效果很好。但是,我需要的是删除 Closing 事件,但我不知道要写什么而不是 EventClick
才能使其正常工作。我试着写 EventClosing
、Closing
,但没有用。因此我的问题是:应该改变什么才能让它工作? 甚至更好 - 我想找到 所有可能输入的列表 因为我可能需要删除其他事件,例如 Closed
、FormClosing
、FormClosed
等
P.S。一个简单的 -=
是不可能的,因为可能会附加许多事件,其中许多事件我根本无法访问,因此我无论如何都无法删除它们。
如评论中所述,我列出了这些事件名称:
typeof(Form).GetFields(BindingFlags.NonPublic | BindingFlags.Static).AsEnumerable().ToList();
现在我有一个看起来像这样的方法:
public static class Utils
{
public static void DisableEvents<T>(this T ctrl, string officialName, string simplifiedName) where T : Control
{
var propertyInfo = ctrl.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
var eventHandlerList = propertyInfo.GetValue(ctrl, new object[] { }) as EventHandlerList;
var fieldInfo = typeof(T).GetField(officialName, BindingFlags.NonPublic | BindingFlags.Static);
var eventKey = fieldInfo.GetValue(ctrl);
var eventHandler = eventHandlerList[eventKey];
var invocationList = eventHandler.GetInvocationList();
foreach (var item in invocationList)
{
ctrl.GetType().GetEvent(simplifiedName).RemoveEventHandler(ctrl, item);
}
}
}
用法如下:
myForm.DisableEvents<Form>("EVENT_CLOSING", "Closing");
不幸的是,我还没有想出一种方法来将单个参数传递给我的方法。
根据前面的post,用法必须是这样的:
myForm.DisableEvents<Form>("EVENT_FORMCLOSING", "FormClosing");
myForm.DisableEvents<Form>("EVENT_FORMCLOSED", "FormClosed");