You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何同时隐藏两个WinForms窗体并跳转至登录窗体?

问题描述

项目包含3个WinForms窗体:

  • Login Form(登录窗体,对应Form1)
  • Dashboard Form(仪表板窗体,对应Form2)
  • Change Password Form(修改密码窗体)

流程逻辑:

  1. 程序启动后显示登录窗体,登录成功后隐藏登录窗体,显示仪表板窗体
  2. 在仪表板中点击修改密码选项,打开修改密码窗体(不隐藏仪表板)
  3. 密码修改完成后弹出提示框,询问是否返回登录页(使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:04:57