【问题标题】:Is the framework setting e.Cancel to true?框架设置 e.Cancel 是否为真?
【发布时间】: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 这是我想要弄清楚的。为什么会这样?

【问题讨论】:

  • 也许这是“预期的”。您正在告诉表单取消其关闭操作,因为您将在准备好(或可能不准备好)时关闭它。

标签: c# windows forms


【解决方案1】:

我在 Framework 2.0 中有完全相同的场景。如果发生了某组事件,那么此后的代码每次都会在这个 sub 的第 3 行的断点处停止,而不管应用中还发生了什么。

这似乎发生在我们禁用表单上的所有控件,然后启用所有这些相同的控件,然后关闭该表单之后(我们正在锁定该表单,因为另一个进程更改了一些相关数据)。

如果这是系统中申请表单关闭事件的最低方法,那么除了框架之外,还有什么可以将 e.Cancel 设置为 true?

Protected Overrides Sub OnFormClosing(e As System.Windows.Forms.FormClosingEventArgs)
  If e.Cancel Then
    e.Cancel = False
  End If
  MyBase.OnFormClosing(e)
End Sub

【讨论】:

    【解决方案2】:

    我不确定您是否要求我们猜测您的代码是否正确或究竟是什么。我可以告诉你,我从未见过这个问题。

    但是,确定某个事件处理程序是否正在取消非常容易:只需使用调试器!单步执行代码,看看会发生什么。

    鉴于您在这里提供的细节很少,我认为您的重点应该是弄清楚发生了什么。

    【讨论】:

    • 很抱歉给您带来了困惑。我会尝试更清楚地重申我的问题。我确实使用了调试器,并且我确定没有任何事件处理程序正在取消它,但我仍在试图弄清楚发生了什么。正如我原来的帖子所说,我添加了 OnClosing() 的覆盖并在其中设置了一个断点。奇怪的是,e.Cancel 在 OnClosing() 的开头已经有了一个 true 值。堆栈跟踪没有帮助,因为它只是说 [外部代码]。我的问题是,在任何情况下框架应该自动取消表单关闭?
    • 好吧,我不知道发生了什么,但我要做的是从调用 close 方法的地方逐步执行每一行代码。框架内可能有一些东西阻止了这种情况,但我无法知道那可能是什么。毕竟,您甚至都没有显示您的代码!
    【解决方案3】:

    你的问题很不清楚。您引用了一个方法OnCancel,但是Form 类中不存在这样的方法。根据问题中的第一句话,您正在使用 .NET 2.0,但是您正在覆盖 Form.OnClosing。请注意,从框架的 2.0 版开始,此方法已被弃用。您应该改用 Form.OnFormClosing,从 2.0 开始新。请尝试覆盖 而是使用该方法,看看您是否观察到相同的问题。我当然从未在OnFormClosing 看到过这样的事情。

    【讨论】:

      猜你喜欢
      • 2019-02-22
      • 1970-01-01
      • 2021-09-29
      • 2015-12-29
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      相关资源
      最近更新 更多