我有两种形式,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析构函数。我的问题是如何避免这个问题?
答案 0 :(得分:5)
来自MSDN:
当表单关闭时,在对象中创建的所有资源都是 关闭,表格处理。您可以阻止关闭表单 在运行时通过处理Closing事件并设置Cancel CancelEventArgs的属性作为参数传递给您的事件 处理程序。
因此,为了防止资源的处置,你唯一能做的就是隐藏表单而不是关闭它:
bool reallyClose;
protected override void OnClosing(CancelEventArgs e)
{
if (!reallyClose)
{
e.Cancel = true;
Hide();
}
base.OnClosing(e);
}
除非您在关闭表单之前手动将reallyClose
标记设置为true
,否则这将阻止表单关闭。
您应该确保在使用完毕后正确关闭表单。
另一种选择可能是从表单本身中分离需要从Form1检索的数据。
答案 1 :(得分:0)
在这种情况下,在form2也关闭之前,不能销毁表单1。只要form2具有对form1的引用,form1将继续存在。更有可能的是,您担心form1被处置。当form1关闭时,它将自行处理。该对象仍然存在,但它将释放其所有子控件和系统对象,如窗口句柄和绘图对象。表单处理完毕后,无法再次显示,并且所有控件都无法访问。如果您尝试使用已处置表单的任何可视组件,它将抛出ObjectDisposedException
。如果要停止处理表单,只需隐藏它而不是关闭它。但是,一旦Form2不再需要它,你应该稍后关闭它,否则它会留下来消耗内存和资源。
答案 2 :(得分:0)
你应该真正考虑两种形式所需的任何数据,从而首先避免耦合形式构造函数的问题。