我在c #windows应用程序中工作。我有两个名为form1的窗口和form2.i通过单击form1中的按钮调用form2但是我在form1的constrcutor中为form2创建了对象。如果我先点击按钮时间form2显示成功之后,我通过单击默认关闭按钮关闭form2并再次单击按钮现在我得到对象处理异常是未处理异常。何时可以避免这种情况?
答案 0 :(得分:2)
不要处理异常,修复代码中的错误。表单实例在表单关闭后死亡,您无法再显示它。要么像这样写:
private void button1_Click(object sender, EventArgs e) {
var frm = new Form2();
frm.Show(this);
}
或者,如果您只想看到表单的一个实例:
Form2 theForm;
private void button1_Click(object sender, EventArgs e) {
if (theForm != null) {
theForm.WindowState = FormWindowState.Normal;
theForm.BringToFront();
}
else {
theForm = new Form2();
theForm.FormClosed += delegate { theForm = null; };
theForm.Show(this);
}
}
答案 1 :(得分:1)
您正在保留对象(此处为窗口)的引用,但您正在关闭它。对象被处理但不是垃圾收集。此处的引用现在无效,因为对象已失去其可用状态。
如果需要重新使用,则需要隐藏表单而不是关闭。或者创建一个新实例以再次加载它。
答案 2 :(得分:1)
您可以使用事件,以便在关闭form2时让form1知道并清除其对它的引用。然后,如果form1已经关闭,那么form1不需要调用它。
答案 3 :(得分:0)
我们在此处执行类似操作,其中包含一些插入第三方应用的工具。代码示例如下:
public class Form1 : Form
{
private Form2 otherForm;
private void ActivateForm2_Click(object sender, EventArgs e)
{
if (otherForm == null || otherForm.IsDisposed)
{
otherForm = new Form2();
otherForm.FormClosed += new FormClosedEventHandler(otherForm_closed);
}
otherForm.Show(this);
}
private void otherForm_Closed(object sender, FormClosedEventArgs e)
{
otherForm.Dispose();
otherForm = null;
}
}