C# WinForm登录后程序终止:打开Home窗体后自动关闭问题
问题原因
你的Login窗体是应用的启动窗体,WinForms默认规则是:启动窗体关闭时,整个应用的消息循环会终止,所有打开的窗体都会被销毁。这就是为什么调用this.Close()后,Home窗体也跟着关闭的核心原因。
解决方案
方法一:修改启动逻辑(推荐)
通过调整Program.cs的启动代码,让Login以模态对话框形式启动,登录成功后再将Home设为主窗体运行:
- 更新
Program.cs的Main方法:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // 以模态方式打开登录窗体 using (Login loginForm = new Login()) { if (loginForm.ShowDialog() == DialogResult.OK) { // 登录成功,启动主窗体 Application.Run(new Home()); } } }
- 修改Login窗体的按钮点击事件:
private void loginbtn_Click(object sender, EventArgs e) { String username = "admin"; String password = "admin"; String @uname = Unametxtbox.Text; String @pass = Passtextbox.Text; if (@uname.Equals(username) && @pass.Equals(password)) { MessageBox.Show("Login Successful"); // 设置对话框结果为OK,告知启动逻辑登录成功 this.DialogResult = DialogResult.OK; this.Close(); } else { MessageBox.Show("Invalid Credentials!"); } }
方法二:临时隐藏Login窗体(不推荐)
如果不想修改启动代码,可以将this.Close()替换为this.Hide(),让Login窗体仅隐藏而非关闭:
private void loginbtn_Click(object sender, EventArgs e) { String username = "admin"; String password = "admin"; String @uname = Unametxtbox.Text; String @pass = Passtextbox.Text; if (@uname.Equals(username) && @pass.Equals(password)) { MessageBox.Show("Login Successful"); Home home = new Home(); home.Show(); // 隐藏登录窗体,而非关闭 this.Hide(); } else { MessageBox.Show("Invalid Credentials!"); } }
注意:这种方法会让Login窗体一直驻留在内存中,直到应用完全退出,资源利用率不如方法一高效。
内容的提问来源于stack exchange,提问作者Santosh
相关产品推荐
相关产品推荐

