2

我在面向 .NET Framework 3.5 的 Visual Studio 2010 中使用 VB.NET。

在我们的(相当大的)客户端应用程序中,有一个表单(Windows Forms)我们遇到了问题。它使用 .ShowDialog 显示(它不是使用 .ShowDialog 显示的唯一表单)。表单上有 Close 和 Cancel 按钮,Enter 键和 Escape 键分别与这些控件相关联(在其他表单上也是如此)。按钮中的代码执行一个 Hide 方法调用以使表单不可见(它实际上是稍后在业务流程逻辑中卸载的),我们再次在其他地方使用其他表单执行此操作。

单击关闭或取消按钮可按需要工作。按下该Enter键也可以根据需要工作(运行关闭单击)。但是当按下 Escape 键时,首先运行 Cancel 按钮逻辑,正如预期的那样,但随后我们收到一个 Form Closed 事件,并且表单被卸载!

没有代码在其他地方寻找 Escape 键并在表单上执行 Close。我们尝试在 Closing 事件中设置 Cancel 参数,但无济于事 - 表单仍在卸载。我们还断开了 Escape 键与 Cancel 按钮的连接,按下 Escape 然后不会运行 Cancel 代码(如预期的那样),但 Form Closed 事件仍然会触发。

我无法在测试程序中复制这种行为,所以很遗憾我不能发布一个工作(实际上不工作)的代码示例。

关于发生了什么的任何输入?为什么 Escape 键关闭表单?

也许最重要的是,我需要做些什么来进一步调查并弄清楚呢?

4

1 回答 1

3

第一个嫌疑人是CancelButton形式。还要检查DialogResult取消按钮的。

如果CancelButton将表单的 设置为按钮,则按下该Esc键会调用按钮的Click事件,将表单设置DialogResultCancel并关闭表单。此外,当您将DialogResult按钮的属性设置为 以外的任何值None时,单击该按钮将关闭表单。来自MSDN

如果该属性的 DialogResult 设置为 None 以外的任何值,并且如果父窗体是通过 ShowDialog 方法显示的,则单击该按钮将关闭父窗体,而无需连接任何事件。

为了进一步研究,覆盖OnFormClosing表单上的方法,在方法上设置断点,当断点被击中时,给我们当前的调用堆栈(来自调用堆栈窗口)。

于 2013-03-16T10:01:25.000 回答