2011-11-28 59 views
2

我有2种形式,这些都是Form1.cs和form2.cs为什么我的C#表单在显示时关闭?

在Form1上,它已经BUTTON1,它将调用窗口2显示

这里的Button1的代码

private void button1_Click(Object sender, EventArgs e) 
{ 
form2 form = new form2(); 

form2.show(); // to call form2 

this.dispose(); //to dispose form1 

} 

和然后form2显示,并突然关闭。有谁知道如何解决这个问题?

+0

添加了一些代码给我的答案,以显示我的意思。 –

回答

3

当你用this.dispose()关闭你的主窗体时,你正在终止该程序,导致form2也被丢弃,因为你正在引用form2。您最好将向form1的引用传递给form2,并使用this.Hide()来代替。

你可以尝试这样的事情:

public partial class Form1 : Form 
    { 

     public Form1() 
     { 
      InitializeComponent(); 
     } 



     private void button1_Click(object sender, EventArgs e) 
     { 
      Form2 form = new Form2(); 
      form.setParent(this); 
      form.Show(); 
      this.Hide(); 

     } 
    } 

而且在窗口2返回到Form1

public partial class Form2 : Form 
    { 
     Form parentForm; 
     public Form2() 
     { 
      InitializeComponent(); 
     } 

     public void setParent(Form value) 
     { 
      parentForm = value; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      parentForm.Show(); 
      this.Close(); 
     } 
    } 
+0

他正在处理主窗体(form1)而不是form2。由于范围,dispose方法无法访问form2。 form2没有被这个代码明确地处理,但是当应用程序死亡时(由于处理主表单)而死亡。 – Neowizard

+0

@Neowizard他在form1中创建form2因此当form1被选中时它也会导致form2被配置。我们正在说同样的事情,我改变了措辞,以便它更准确。 –

0

如果form1的是程序启动,然后应用程序将关闭。因此,代替

this.dispose(); 

你刚刚写

this.hide(); 
0

展()不会等待窗口2继续下一个命令(处置)之前关闭。 这将最终在关闭form2,因为它可能运行在后台线程上。

使用ShowDialog来执行Dispose直到第二个窗体关闭。

此外,您可以将第二个窗体设置为在前台线程上运行。这样第二种形式将不依赖于第一种生活。

2
private void button1_Click(Object sender, EventArgs e) 
{ 
form2 form = new form2(); 

form2.show(); // to call form2 

this.hide(); //to hide form1 

}