C#程序结束时的表单关闭

C#程序结束时的表单关闭,c#,forms,C#,Forms,我有一个windows窗体问题: Program.cs: Application.Run(new frmStart()); frmStart:onbtnLoad\u单击 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:在btnCanc

我有一个windows窗体问题:

Program.cs:

Application.Run(new frmStart());
frmStart:on
btnLoad\u单击

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\u上单击

Application.Exit();   
// or this.Close(); 
// or even: base.Close();
表单消失了,但程序没有结束,我仍然必须按蓝色的“停止调试”使其停止


我一直在找。。。我知道有可能使程序真正停止,而不仅仅是在关闭第二个窗体时冻结,即使您没有将第一个窗体保留在屏幕上,但却记不起来,也不知道如何操作。

frmStart中添加:

public static frmStart Current;
Current = this;
然后在构造函数中添加:

public static frmStart Current;
Current = this;
然后在frmLoad:onbtnCancel\u中单击:

frmStart.Current.Close();

frmStart中添加:

public static frmStart Current;
Current = this;
然后在构造函数中添加:

public static frmStart Current;
Current = this;
然后在frmLoad:onbtnCancel\u中单击:

frmStart.Current.Close();

确实应该对这两个函数调用Close()。这是唯一干净的方法,否则第一个表单永远不会被告知关闭,也不会干净

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


如果同时关闭这两个应用程序,则应用程序将退出。

您确实应该对这两个应用程序调用close()。这是唯一干净的方法,否则第一个表单永远不会被告知关闭,也不会干净

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


如果同时关闭这两个线程,则应用程序将退出。

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


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


确认,-1在Application.ExitThread上

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

        var newForm = new frmLoad();
        newForm.FormClosed += (closedSender, closedE) => Close();
        newForm.Show();
        Hide();
        var newForm = new frmLoad();
        newForm.FormClosed += (closedSender, closedE) =>
                                {
                                    if (newForm.UserCancelled)
                                        Close();
                                };
        newForm.Show();
        Hide();
这基本上是这样设置的:当frmLoad表单关闭时,主表单调用它的Close()方法。我为事件处理程序使用了Lambda表达式,但是您可以同样轻松地创建一个私有方法,该方法接受一个(objectsender,EventArgs e)和point.FormClosed

*编辑:抱歉,错过了您只想在特定状态下关闭的消息。在这种情况下,请在frmLoad上创建公共属性,例如:

公共布尔用户取消 { 得到; 私人设置; }

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

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

确认,Application.ExitThread上为-1

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

        var newForm = new frmLoad();
        newForm.FormClosed += (closedSender, closedE) => Close();
        newForm.Show();
        Hide();
        var newForm = new frmLoad();
        newForm.FormClosed += (closedSender, closedE) =>
                                {
                                    if (newForm.UserCancelled)
                                        Close();
                                };
        newForm.Show();
        Hide();
这基本上是这样设置的:当frmLoad表单关闭时,主表单调用它的Close()方法。我为事件处理程序使用了Lambda表达式,但是您可以同样轻松地创建一个私有方法,该方法接受一个(objectsender,EventArgs e)和point.FormClosed

*编辑:抱歉,错过了您只想在特定状态下关闭的消息。在这种情况下,请在frmLoad上创建公共属性,例如:

公共布尔用户取消 { 得到; 私人设置; }

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

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

我对所有的答案都投了反对票。在主窗体中覆盖窗体关闭,然后首先关闭辅助窗体。

我对所有答案都投了反对票。在主窗体中覆盖窗体关闭,然后首先关闭辅助窗体。

您是否尝试过Application.ExitThreadIn frmLoad,当按下btnCancel时,您希望它重新打开frmStart还是完全关闭应用程序?@HatSoft:请将您的评论放在回答中,我愿意接受这个!谢谢。根据,Application.Exit()应关闭您的应用程序。你确定没有像Form_Closing这样的事件会取消退出吗?@emptyheaded我已将其添加为answer你是否尝试过应用程序。ExitThreadIn frmLoad当按下btnCancel时,你希望它重新打开frmStart还是完全关闭应用程序?@HatSoft:请在回答中添加你的评论,我愿意接受这个!谢谢。根据,Application.Exit()应关闭您的应用程序。你确定没有像Form_Closing这样的事件会取消退出吗?@emptyheaded我添加了它作为回答谢谢你,但我会接受Chuck的回答,因为这是更可预测的需要发生的事情-并且在将来也会记住这一点。谢谢你,不过我会接受Chuck的答案,因为它更能预测需要发生的事情,并且在将来也会记住这一点。我喜欢这一点,但在我习惯使用它之前,我需要学习更多。。。谢谢。我喜欢这个,但在我习惯使用它之前,我需要学习更多。。。非常感谢。