我有一个带有一个主表单的应用程序。在窗体中,我有一个类 C 的对象 objC。窗体从我的控件 objC 获取并将其放入面板中。表单通过调用和订阅 objC 事件的方法与 objC 进行交互。
当我尝试通过单击 [X] 按钮或调用 this.Close() 来关闭表单时,表单未关闭。它调用 FormClosing 的处理程序。在处理程序中,我调用 objC.Dispose()。我查了一下,没有出现异常。在 objC.Dispose() 中,我取消订阅所有表单的事件处理程序。我使用以下代码从面板中删除了控件:
splitContainerMain.Panel2.SuspendLayout();
{
splitContainerMain.Panel2.Controls.Clear();
}
splitContainerMain.Panel2.ResumeLayout();
但它就是不会关闭。我可以尝试关闭任意多次,FormClosing 事件将重复,但 FormClose 永远不会生成。
当我不创建控件并将其添加到面板时,不会重现此错误。我做错了什么?
最佳答案
对此的解释很少。但其中之一是,您可能有一个正在取消验证的 Validating 事件处理程序。这也将取消 OnFormClosing。修复:
void Form1_FormClosing(object sender, FormClosingEventArgs e) {
e.Cancel = false;
}
顺便说一句,调用 Suspend/ResumeLayout 是没有意义的,在表单关闭时没有完成布局。调用 Controls.Clear() 并不会真正释放控件。这种令人讨厌的行为让很多程序员感到困惑。最好的办法就是什么都不做,父控件会自动处置其子控件。取消订阅事件也没有意义,表单对象和 objC 对象仅相互引用,不存在其他引用。垃圾收集器知道如何处理这个问题。
关于C# WinForm 不关闭。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5318876/