C#表格在程序结束时结束

时间:2012-07-16 23:10:49

标签: c# forms

我有一个Windows窗体问题:

的Program.cs:

Application.Run(new frmStart());

frmStart:on 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();

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

我一直在寻找...我知道有可能让程序真正停止,而不只是在关闭第二个表单时冻结,即使你没有在屏幕上保留第一个表单,但可以'记住并且无法弄清楚如何。

5 个答案:

答案 0 :(得分:1)

frmStart 中添加:

public static frmStart Current;

然后在构造函数中添加:

Current = this;

然后在frmLoad:on btnCancel_Click

frmStart.Current.Close();

答案 1 :(得分:1)

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

您可能知道这样做是安全的,但是稍后处理代码的其他人可能会以他们需要调用的第一种形式在OnClose中添加代码。当他们最终弄清楚为什么他们的代码没有被调用时,他们会说你的好话。

如果同时关闭两者,则您的应用将退出。

答案 2 :(得分:1)

请使用Application.ExitThread()方法,该方法退出当前线程上的消息循环并关闭线程上的所有窗口。

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.exitthread

答案 3 :(得分:1)

Ack,-1在Application.ExitThread上!

问题是您尚未关闭主表单。最简单的方法是挂钩第二个窗体的Closed事件并使其关闭主窗体。例如,打开第二个表单的代码更改为:

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

这基本上设置为当frmLoad表单关闭时,main表单调用它的Close()方法。我为事件处理程序使用了Lambda表达式,但您可以轻松地创建一个私有方法,接受(对象发送者,EventArgs e)并指向它的.FormClosed。

*编辑:对不起,错过了你只想关闭某个州。在你的frmLoad上的这种情况下,创建一个公共属性,如:

public bool UserCancelled {     得到;     私人集; }

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

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

答案 4 :(得分:1)

我对所有答案都赞不绝口。覆盖主要表单中的表单结束并首先关闭辅助表单。