C# WinForm 不关闭。

标签 c# winforms

我有一个带有一个主表单的应用程序。在窗体中,我有一个类 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/

相关文章:

c# - 列表框中的 MySQL 数组

C# 代码生成器可以加快数据库驱动软件的开发速度?

c# - 多维整数列表 C#

.net - 如何禁用整个 .net DataGridView 列的工具提示

c# - ExecuteNonQuery() 语法错误 c#

c# - 通过反射获取公共(public)静态字段的值

c# - 如何判断 Windows 窗体是否已打开但在另一个窗口后面?

c# - Richtextbox 上的编号列表

c# - 在 Windows 窗体应用程序中动态增加/减少视频的速度

c# - 在多个表单上重写 ProcessDialogKey 方法