【问题标题】:Escape key is closing a Windows Forms form with no code or settings tied to itEscape 键正在关闭没有代码或设置与之关联的 Windows 窗体窗体
【发布时间】:2013-03-15 20:32:12
【问题描述】:

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

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

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

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

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

关于发生了什么的任何意见?为什么 Escape 键会关闭表单?

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

【问题讨论】:

  • 我想你已经将表单上的属性 CancelButton 设置为 Cancel 按钮。
  • 代码会有所帮助。向我们展示创建和显示表单的代码,以及与表单对象交互的任何其他代码。

标签: vb.net winforms


【解决方案1】:

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

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

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

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

【讨论】:

  • 问题出在 DialogResult,需要将其设置回 None 以防止表单关闭。
  • 我将研究 DialogResult 按钮属性,尽管这可能需要我几天时间来详细了解它。感谢您的建议和信息。
  • 我的关闭和取消按钮的 DialogResult 是 None,因此运行这些并没有设置表单 DialogResult 属性。根据上面 MD Unicorn 的评论,按下 Esc 键确实将 DialogResult 表单设置为 Cancel。我现在正在表单 OnFormClosing 覆盖中将表单 DialogResult 重置为 None,并且我不再看到表单关闭。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-09-03
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多