0

我有两种形式,form1需要从中获取数据form2,我在构造函数中使用一个参数form2来获取form1's这样的实例:

public form2(Form form1) {
this.f = form1;
}

在form1中:

Form form2 = new Form(this);

但是当我关闭form1时,似乎调用了form1 destruct。我的问题是如何避免这个问题?

编辑:我的问题中有很多打字错误,很抱歉,已修复:

我有两种形式,form2需要从中获取数据form1,我在构造函数中使用一个参数form1来获取form1's这样的实例:

private Form f;
public form2(Form form1) {
this.f = form1;
}

在form1中:

Form form2 = new Form(this);

但是当我关闭form2时,似乎调用了form1析构函数。我的问题是如何避免这个问题?

4

3 回答 3

5

来自MSDN

当窗体关闭时,对象内创建的所有资源都将关闭并释放窗体。您可以通过处理 Closing 事件并设置作为参数传递给事件处理程序的 CancelEventArgs 的 Cancel 属性来防止在运行时关闭窗体。

因此,为了防止资源被丢弃,你唯一能做的就是隐藏表单而不是关闭它:

bool reallyClose;

protected override void OnClosing(CancelEventArgs e)
{
    if (!reallyClose)
    {
        e.Cancel = true;
        Hide();
    }
    base.OnClosing(e);
}

这将防止表单被关闭,除非您在关闭表单之前手动将reallyClose标志设置为true

您应该确保在完成使用后正确关闭表单。

另一种选择可能是将需要从 Form1 检索的数据与表单本身分离。

于 2012-06-26T17:11:40.617 回答
0

在这种情况下,form 1 不能被销毁,直到 form2 也关闭。只要 form2 有对 form1 的引用,form1 就会继续存在。更有可能的是,您担心 form1 被处置。当 form1 关闭时,它会自行处理。该对象仍将存在,但它会释放其所有子控件和系统对象,例如窗口句柄和绘图对象。一旦表单被处理,它就不能再次显示,并且它的所有控件都将无法访问。如果您尝试使用已处置表单的任何可视组件,它将抛出一个ObjectDisposedException. 如果您想阻止表单被处理,只需隐藏它而不是关闭它。但是,您应该稍后在 Form2 不再需要它时将其关闭,否则它将一直占用内存和资源。

于 2012-06-26T17:18:36.873 回答
0

您应该真正从两种表单中完全考虑您需要的任何数据,从而首先避免耦合表单构造函数的问题。

于 2012-06-26T17:41:13.860 回答