2012-07-16 46 views
0

我有一个窗口形成问题:C#形式闭合

的Program.cs:

Application.Run(new frmStart()); 

frmStart:上btnLoad_Click

frmLoad formLoad = new frmLoad(); 
formLoad.Show(); 
this.Hide(); // if I do a this.Close(); after it shuts down and doesn't get to show the form 

frmLoad:上btnCancel_Click

Application.Exit(); 
// or this.Close(); 
// or even: base.Close(); 

表单消失,但程序没有结束,我仍然必须按蓝色的“停止调试”才能停止。

我一直在寻找......我知道这是可能使程序真正停止,而不是当您关闭第二种形式只是冻结,即使你不保持在屏幕上的第一种形式,但可不记得,也不知道如何。

+1

你试过了Application.ExitThread – HatSoft 2012-07-16 23:14:04

+0

在frmLoad中按下btnCancel时是否要重新打开frmStart或完全关闭应用程序? – craig1231 2012-07-16 23:14:36

+0

@HatSoft:您能否将您的评论置于答案中,我想接受这个答案!谢谢。 – Thalia 2012-07-16 23:18:00

回答

1

确认,-1 Application.ExitThread!

的问题是,你还没有关闭的主要形式。最简单的方法是钩住第二个窗体的Closed事件并关闭主窗体。例如代码,打开第二个形式更改为:

 var newForm = new frmLoad(); 
     newForm.FormClosed += (closedSender, closedE) => Close(); 
     newForm.Show(); 
     Hide(); 

这实质上设置,以便当frmLoad窗体关闭,主窗体调用它的close()方法。我为事件处理程序使用了Lambda表达式,但您可以轻松创建一个接受(对象发件人,EventArgs e)并指向.FormClosed的私有方法。

*编辑:对不起,错过了,你只想要关闭某些状态。在这种情况下,你的frmLoad,创建一个公共财产,如:

public bool UserCancelled { get; 私人设置; }

其中取消按钮将其设置为True在关闭表单之前。在主窗体更改您的事件处理程序:

 var newForm = new frmLoad(); 
     newForm.FormClosed += (closedSender, closedE) => 
           { 
            if (newForm.UserCancelled) 
             Close(); 
           }; 
     newForm.Show(); 
     Hide(); 
+0

我喜欢这个,但是在我使用它之前需要多学习一些......谢谢。 – Thalia 2012-07-16 23:31:47

1

frmStart地址:

public static frmStart Current; 

然后在构造地址:

Current = this; 

然后在frmLoad:上btnCancel_Click

frmStart.Current.Close(); 
1

你真的应该在两者上都调用Close()。这是唯一的干净方式,否则第一种形式永远不会被告知关闭并且不会清理。

你可能知道它的安全,这样做,但别人的代码工作以后可以在第一种形式,他们需要调用的OnClose添加代码。当他们终于弄清楚为什么他们的代码没有被调用时,他们会说你不好。

如果关闭这两个,那么你的应用程序将退出。

1

我对所有的答案投票呸。在主表单中覆盖表单关闭并首先关闭辅助表单。