我在Visual Studio 2010中使用VB.NET,面向.NET Framework 3.5。
在我们(相当大的)客户端应用程序中,有一个表单(Windows Forms)我们遇到了问题。它与.ShowDialog一起显示(它不是与.ShowDialog一起显示的唯一表单)。表单上有“关闭”和“取消”按钮,Enter键和Escape键分别与这些控件绑定(这也在其他表单上完成)。按钮中的代码执行Hide方法调用以使表单不可见(它实际上在业务流程逻辑中稍后卸载),并且我们再次使用其他表单执行此操作。
单击“关闭”或“取消”按钮可以根据需要使用。按 Enter 键也可以按预期工作(运行关闭单击)。但是当按下Escape键时,首先按预期运行“取消”按钮逻辑,但随后我们收到一个Form Closed事件,表单将被卸载!
其他地方没有代码可以查找Escape键并在表单上执行关闭。我们尝试在Closing事件中设置Cancel参数,但无效 - 表单仍然卸载。我们还将“退出”键与“取消”按钮断开连接,按Escape键然后不运行“取消”代码(如预期的那样),但“表格已关闭”事件仍然会触发。
我无法在测试程序中复制此行为,所以很遗憾,我无法发布一个有效的(非实际的)代码示例。
有关正在发生的事情的任何输入?为什么Escape键关闭表单?
也许最重要的是,我需要做些什么才能进一步调查并找出答案?
答案 0 :(得分:3)
第一个嫌疑人是表格的CancelButton
。同时检查取消按钮的DialogResult
。
如果您将表单的CancelButton
设置为按钮,请按 Esc 键调用按钮的Click
事件,将表单的DialogResult
设置为{ {1}}并关闭表单。此外,当您将按钮的DialogResult
属性设置为Cancel
以外的任何其他属性时,单击该按钮将关闭该表单。来自MSDN:
如果此属性的DialogResult设置为None以外的任何值,并且如果通过ShowDialog方法显示父窗体,则单击该按钮将关闭父窗体,而无需挂接任何事件。
要进一步调查,在窗体上覆盖None
方法,在方法上设置断点,当命中断点时,给我们当前的调用堆栈(来自Call Stack窗口)