我正在编写一个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这是我想要弄清楚的。为什么会这样?
答案 0 :(得分:1)
我在Framework 2.0中有完全相同的场景。如果发生某一组事件,那么以下代码将在此后的每个第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
答案 1 :(得分:0)
我不确定您是否要求我们猜测您的代码是正确的还是确切的。我可以告诉你,我从未见过这个问题。
但是,确定某个事件处理程序是否正在取消是非常容易的:只需使用调试器即可!逐步完成代码,看看会发生什么。
鉴于您在此提供的细节数量很少,我认为您的重点应放在弄清楚发生了什么。
答案 2 :(得分:0)
你的问题很不清楚。您引用了一个方法OnCancel
,但Form
类中不存在这样的方法。您根据问题中的第一句使用.NET 2.0,但是您要覆盖Form.OnClosing
。请注意,从框架的2.0版开始,不推荐使用此方法。您应该使用Form.OnFormClosing代替,从2.0开始使用新版本。请尝试覆盖
相反,该方法,看看你是否观察到同样的问题。我当然从未在OnFormClosing
看过这样的事情。