.net base.dispose()也正在关闭其他表单。

时间:2012-04-26 07:16:18

标签: .net winforms dispose

我在我的应用程序中使用两个表单让Say A和B.在关闭A时我需要在A else的dispose方法中调用base.dispose(),有时我会因为内存问题而看到应用程序的一些意外行为。 表格B是表格B =新表格的本地申报表格,并由ShowDialog方法显示。 当我在表单A中调用base.dispose()时,它也关闭表单B.但我需要保持表格B开放。有什么建议 ?

谢谢, 阿比纳夫

2 个答案:

答案 0 :(得分:1)

由于表格A拥有表格B,因此这是预期的行为。

将表单B的声明和创建作为Program.cs中的全局资源移至您的应用,并从表单A调用其FormB的Show()方法。

ShowDialog意味着一个模态对话框,在您描述的场景中没有意义。如果您确实需要,请指定全局所有者并在ShowDialog(owner)

中使用该所有者

顺便说一句。专注于根本原因内存问题,而不是试图围绕它实现基于UI的监视功能。

答案 1 :(得分:0)

在您的应用程序设置中,您可以定义关闭模式(关闭主窗体或关闭最后一个窗体)。尝试将其设置为在最后一个表单上关闭。

更新:我自己尝试了并关闭调用者(在另一个表单上调用ShowDialog()的表单也会关闭对话框本身,我想这是设计的。

但是,使用此代码,我可以创建一个对话框,关闭调用者并且对话框仍然存在:

// inside formA
private void button2_Click(object sender, EventArgs e)
{
    var owner = new Form();
    var dialog = new FormB();

    // attach to the dialog.button1.Click event to force a close
    // of the current formA instance.
    // button1.modifiers has (at least) to be set internal
    dialog.button1.Click += (x, y) => this.Close();
    dialog.ShowDialog(owner);

    dialog.Dispose();
    owner.Dispose();
}

现在,如果我单击FormB中的button1,FormA将关闭,表单B仍然存在。 FormA不是主要形式。