我有一个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();
表单消失但程序没有结束,我仍然需要按蓝色“停止调试”才能停止。
我一直在寻找...我知道有可能让程序真正停止,而不只是在关闭第二个表单时冻结,即使你没有在屏幕上保留第一个表单,但可以'记住并且无法弄清楚如何。
答案 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)
我对所有答案都赞不绝口。覆盖主要表单中的表单结束并首先关闭辅助表单。