0

我有一个 Windows 窗体问题:

程序.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();

表格消失了,但程序并没有结束,我还是要按蓝色的“停止调试”让它停止。

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

4

5 回答 5

1

frmStart添加:

public static frmStart Current;

然后在构造函数中添加:

Current = this;

然后在 frmLoad: 上btnCancel_Click

frmStart.Current.Close();
于 2012-07-16T23:17:28.917 回答
1

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

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

如果您同时关闭两者,那么您的应用程序将退出。

于 2012-07-16T23:18:46.110 回答
1

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

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

于 2012-07-16T23:18:58.357 回答
1

确认,Application.ExitThread 上的 -1!

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

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

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

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

公共布尔用户取消{得到; 私人套装;}

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

        var newForm = new frmLoad();
        newForm.FormClosed += (closedSender, closedE) =>
                                {
                                    if (newForm.UserCancelled)
                                        Close();
                                };
        newForm.Show();
        Hide();
于 2012-07-16T23:23:45.350 回答
1

我对所有答案都投了赞成票。在您的主要表单中覆盖表单关闭并首先关闭辅助表单。

于 2012-07-16T23:23:54.803 回答