【发布时间】:2017-06-12 21:46:04
【问题描述】:
我找到了一个很好的例子,说明如何从表单中删除所有 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 等事件。
附:一个简单的-= 是不可能的,因为可能有许多附加的事件,其中许多我根本无法访问,因此我无论如何都无法删除它们。
【问题讨论】:
-
你想要强制表单不关闭吗?
-
不,实际上恰恰相反——我想在不触发任何事件的情况下关闭它,除了标准关闭。例如:我想阻止表单显示询问“有未保存的更改。您确定要关闭吗?”的 MessageBox。
-
所以当您单击或尝试关闭表单时,它会显示带有问题的消息框?我无法完全理解您的问题,但您不能删除显示消息框的代码吗?
-
是的,这是正确的 - 它显示一个对话框。除了创建
var form = new MyForm(); form.ShowDialog();之外,我无法控制表单。然后我想用form.Close();关闭它,但是对话框阻止代码继续,因此我想摆脱它。我正在对数百个这样的表格进行测试,我只想看看它们是否成功打开。也许还有另一种关闭对话框本身的方法,但我试图找出带有对话框和没有对话框的表单之间的区别——唯一的区别是 CanFocus 属性的值。 -
我似乎找到了用
typeof(Form).GetFields(BindingFlags.NonPublic | BindingFlags.Static).AsEnumerable().ToList()显示事件列表的解决方案
标签: c# winforms events event-handling formclosing