【发布时间】:2011-05-04 16:14:24
【问题描述】:
我正在编写一个 Windows 窗体应用程序(2.0 框架),但遇到了一个奇怪的错误。
在我的表单中,当引发特定异常时,我有一个 catch 块,它应该记录错误,通过对话框通知用户,然后通过调用 this.Close() 关闭表单。前两个步骤工作正常,但 this.Close() 没有做任何事情。我的第一个想法是我必须有一个将 e.Cancel 设置为 true 的事件处理程序,但是在彻底检查代码之后,我找不到。另外,我没有重写表单的 OnCancel 方法。
在尝试追踪错误的过程中,我为表单的 OnCancel 方法编写了一个覆盖,并在其中设置了一个断点。在 OnCancel 开始时,e.Cancel 已经设置为 true。如果我的理解是正确的,覆盖应该在任何事件处理程序之前运行,这样似乎排除了这个问题是由我以某种方式错过的事件处理程序引起的可能性。
在我的 OnClosing 覆盖方法中,如果我将 e.Cancel 设置为 false,则表单将正常关闭,并且我的程序按我的预期工作,但我不想以这种方式修复它。显然有一些代码会产生意想不到的副作用,我想了解发生了什么,而不是求助于“数字胶带”。
似乎框架本身正在取消我的表单关闭。在任何情况下框架会这样做吗?
谢谢。
编辑...
我创建了一个小型测试项目,并且能够以更简单的形式重新创建错误。
如果您想重新创建这种情况以便明白我的意思,试试这个... 创建一个表单并添加一个文本框(我假设其他控件也可以工作)。让您的表单处理文本框的 Validated 事件,并在处理程序中调用 this.Close。现在覆盖 Form.OnClosing() 并在其中设置断点。
现在运行程序,输入一些文本,然后从文本框中跳出标签,以便它验证(我猜你会想要添加一个按钮或其他东西,以便你有一些其他控件可以使用标签。)
在 OnClosing 开始时, e.Cancel 将自动设置为 true 这是我想要弄清楚的。为什么会这样?
【问题讨论】:
-
也许这是“预期的”。您正在告诉表单取消其关闭操作,因为您将在准备好(或可能不准备好)时关闭它。