我有一个表单,当单击一个按钮(form1button)时将打开一个新表单。在子表单上会有另一个按钮'form2button'。现在,如果我单击此form2按钮,则应该处理新的form2。但是因为form2对象是在form1类方法中创建的,所以我无法在form2类方法中处理该对象(fom2buttonclick)。所以我使用static来完成我的工作,如下面的伪代码。
Form1中:
class Form1 : Form
{
static Form2 f2;
public void Form1_buttonclick(object sender, EventArgs e)
{
f2 = new Form2();
}
public void Disposef2()
{
f2.Dispose();
}
}
窗体2:
class Form2 : Form
{
public void Form2_buttonclick(object sender, EventArgs e)
{
Form1 f1 = new Form1();
f1.Disposef2();
}
}
还有其他更好的方法吗?或者C#设计本身并不提供替代机制。我是C#的新手。请帮帮我..
修改
我想关闭(明确处置)form2对象,当单击form2上的按钮时,该对象在form1类中创建。这个编辑是为了更清晰。
答案 0 :(得分:7)
关于处理表单的MSDN文档:
将自动调用Dispose 如果使用Show显示表单 方法。如果是另一种方法如 使用ShowDialog,或表单是 从来没有显示过,你必须打电话 把你自己放在你的 应用
关闭与处置:
表单关闭时,所有资源 在对象内创建的是关闭的 并且表格处理完毕。您可以 防止在运行时关闭表单 处理Closing事件的时间和 设置的取消属性 CancelEventArgs作为参数传递 到您的事件处理程序。如果形式你 正在关闭的是启动形式 你的申请,你的申请 结束。
表单不是的两个条件 处于关闭状态时是(1)它 多文档界面的一部分 (MDI)应用程序,而表单则不是 可见; (2)你已经展示了 使用ShowDialog的表单。在这些 在这种情况下,您需要调用Dispose 手动标记所有表单 控制垃圾收集。
答案 1 :(得分:3)
如果两个表单没有父对话框类型的关系,您可能只想挂钩子窗体上的Disposed事件,以便在关闭时收到通知。
public partial class Form1 : Form
{
private Form2 _Form2;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (_Form2 != null)
_Form2.Dispose();
_Form2 = new Form2();
_Form2.Disposed += delegate
{
_Form2.Dispose();
_Form2 = null;
};
_Form2.Show();
}
}
然后你在Form2中所要做的就是关闭它:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Close();
}
}
答案 2 :(得分:1)
您不需要在表单上显式调用Dispose,垃圾收集器会为您执行此操作。
如果你想在Form2“消失”时发生特定的事情,你可以勾选它的表格结束事件。
编辑:
在Form2上,单击按钮,尝试
this->Close();
这将关闭form2的实例(表单将消失)。如果form1仍然有对form2的引用,那么垃圾收集器将不会获取form2,GC也不会处理它。
如果form1有理由保留对form2的引用?
如果是这样,form1应该处理from2的结束事件,然后form1可以释放它对form2的引用(将其设置为null)。
现在GC将拾取form2作为要收集的候选者,它将(可能不止一步)调用它的Dispose方法并释放Form2的内存。
答案 3 :(得分:1)
你真的不是读者吗?这里已有很多答案。
编辑我要关闭(处理 明确地说,form2对象是 按钮打开时在form1类中创建 单击form2。这个编辑是给 更清晰。
如果使用ShowDialog,则在调用close()时返回form2。所以在Form1中:
private void button1_Click(object sender, System.EventArgs e)
{
Form2 oForm2 = new Form2();
oForm2.MyParentForm = this;
if (oForm2.ShowDialog() == DialogResult.OK)
{
oForm2.Dispose(); //or oForm2.Close() what you want
}
}
然后在form2中调用Close()。
答案 4 :(得分:0)
我为我的项目做过一次,关闭一个应用程序并打开另一个应用程序。
System.Threading.Thread newThread;
Form1 frmNewForm = new Form1;
newThread = new System.Threading.Thread(new System.Threading.ThreadStart(frmNewFormThread));
this.Close();
newThread.SetApartmentState(System.Threading.ApartmentState.STA);
newThread.Start();
并添加以下方法。你的newThread.Start会调用这个方法。
public void frmNewFormThread)()
{
Application.Run(frmNewForm);
}