如何同时隐藏两个WinForms窗体并跳转至登录窗体?
问题描述
项目包含3个WinForms窗体:
- Login Form(登录窗体,对应
Form1) - Dashboard Form(仪表板窗体,对应
Form2) - Change Password Form(修改密码窗体)
流程逻辑:
- 程序启动后显示登录窗体,登录成功后隐藏登录窗体,显示仪表板窗体
- 在仪表板中点击修改密码选项,打开修改密码窗体(不隐藏仪表板)
- 密码修改完成后弹出提示框,询问是否返回登录页(使用
MessageBoxButtons.YesNo)
当前修改密码窗体中的代码如下,if (dial == DialogResult.Yes)分支逻辑无效,无法实现同时隐藏修改密码窗体和仪表板窗体、显示登录窗体的需求:
DialogResult dial = MessageBox.Show("Password successfully changed.\n\nDo you want to return to login page?", "Success", MessageBoxButtons.YesNo, MessageBoxIcon.Information); if (dial == DialogResult.Yes) { this.Hide(); Form2 frm2 = new Form2(); frm2.ShowDialog(); Hide(); Form1 frm1 = new Form1(); frm1.ShowDialog(); Close(); } else if (dial == DialogResult.No) this.Hide();
解决方案
问题出在你创建了新的Form2实例,而非操作当前已经打开的仪表板窗体。正确的做法是找到已打开的Form2实例,隐藏它,再显示登录窗体,最后关闭当前修改密码窗体。
修正后的代码:
DialogResult dial = MessageBox.Show("Password successfully changed.\n\nDo you want to return to login page?", "Success", MessageBoxButtons.YesNo, MessageBoxIcon.Information); if (dial == DialogResult.Yes) { // 找到当前已打开的仪表板窗体实例 Form2 dashboard = Application.OpenForms.OfType<Form2>().FirstOrDefault(); // 如果找到则隐藏它 dashboard?.Hide(); // 隐藏当前修改密码窗体并显示登录窗体 this.Hide(); Form1 loginForm = new Form1(); loginForm.Show(); this.Close(); } else if (dial == DialogResult.No) { this.Hide(); }
关键说明:
- 使用
Application.OpenForms.OfType<Form2>().FirstOrDefault()获取已打开的Form2实例,而非新建实例 - 调用
dashboard?.Hide()安全隐藏仪表板(?.避免空引用异常) - 最后关闭当前修改密码窗体,确保资源释放
内容的提问来源于stack exchange,提问作者curious_coder
相关产品推荐
相关产品推荐

