c#中form关闭问题

来源:百度知道 编辑:UC知道 时间:2024/05/28 11:13:27
form1里的
private void button1_Click(object sender, EventArgs e)
{
Form2 f2=new Form2();
f2.Show();
Hide();
}

private void button2_Click(object sender, EventArgs e)
{
this.Dispose();
//Close();

}
form2里的
private void button1_Click(object sender, EventArgs e)
{
Form1 f1 = new Form1();
f1.Show();
Close ();
}
为什么我运行后
直接点form1里的button2,程序直接退出
但是如果点了form1里的button1进入form2,再由from2点button1回到form1,这时候点button2就只是窗口没了,但是不能退出程序?

我们来整理一下你第二次操作的过程就知道问题在哪里了。

点了form1实例(我们设为f1)里的button1
创建了一个form2的实例 (我们设为f2)并显示f2 隐藏f1

点击f2的button1 创建了一个form1的实例f1' 并显示f1'
注意 因为你是new的 所以这时候实际上是创建了一个新的form1的实例,而原有实例仍然处于隐藏状态并未关闭。
关闭f2
这时候f1未显示 显示的是f1'
点击f1'上的button2 关闭f1'
此时f1仍旧在内存里处于隐藏状态并未关闭。
而由于f1是程序的入口主窗体 所以虽然这时候它不可见 但程序仍然未退出。

通常情况下创建子窗体的时候应该对其指定父窗体。以便于把各窗体之间连起来。例如在f1的button onclick中创建f2的时候指定其parentform为f1(this)
这样在f2关闭之前可以让其parentform显示后再关闭f2 而不是创建一个新对象。
Appliction.Exit(); 确实可以退出程序。但从程序运行的情况来讲 用这种方式解决问题是不对的。因为form1的实例出现了两个。如果程序做得更大些 仍然按这种思路去设计窗体,那岂不是会消耗非常多的资源。程序的运行效率和内存占用情况就非常高,并且是毫无必要的浪费资源。

楼主出现这样的错误是初学者很常见的 其原因就是对面向对象理论的理解还不够。请多翻阅一下面向对象理论书籍以避免此类问题的再次发生。

当你点form1的button2时,执行了Dispose()方法,他会释放所有资源当然也包换当前窗口,所以程序退出。而当你点击了button1时,会实例化一个form2的对象。而你的form1对象并没有销毁,(当然也不能销毁因为其是一个启动窗体。一旦消毁整个程序都会退出!)当你点击form2上的button1时又会重新实例化一个form1对象,记住这个form1对象并不是你以前的启动时的那个form1而是另外一个对象,只是属性、字段以及方法与其一样!当你现在在这个窗体上点button1按键时只是释放了你这个窗体对象,而