繁体   English   中英

框架设置 e.Cancel 是否为真?

[英]Is the framework setting e.Cancel to true?

我正在编写一个 Windows Forms 应用程序(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 这就是我想要弄清楚的。 为什么会这样?

我在 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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM