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

WinForms中如何保留窗体状态并在不同窗体间切换加载

解决WinForms窗体切换时重复创建实例导致数据丢失的问题

核心思路是缓存已创建的子窗体实例,点击按钮时优先复用已有实例而非每次新建,以此保留用户输入的内容和操作数据。

步骤1:在主窗体中添加缓存容器

在主窗体类中声明字典,通过窗体类型作为标识,存储已创建的子窗体实例:

// 主窗体私有字段,用于缓存子窗体实例
private Dictionary<Type, Form> _cachedChildForms = new Dictionary<Type, Form>();

步骤2:修改按钮点击事件逻辑

修改原有点击事件,先检查目标窗体是否已存在于缓存:

  • 若存在:直接将该窗体移至主面板并显示
  • 若不存在:创建新实例并加入缓存后再显示

修改后的ButtonECM_Click代码:

private void ButtonECM_Click(object sender, EventArgs e)
{
    this.panelDesktop.Controls.Clear();
    Form targetForm;

    // 检查缓存中是否已有FrmECM实例
    if (_cachedChildForms.TryGetValue(typeof(FrmECM), out targetForm))
    {
        // 复用已有实例,移至当前面板并置顶显示
        this.panelDesktop.Controls.Add(targetForm);
        targetForm.Show();
        targetForm.BringToFront();
    }
    else
    {
        // 创建新实例并配置属性
        FrmECM newECMForm = new FrmECM() 
        { 
            Dock = DockStyle.Fill, 
            TopLevel = false, 
            TopMost = true,
            FormBorderStyle = FormBorderStyle.None 
        };
        // 绑定关闭事件,窗体关闭时从缓存移除,避免保留无效实例
        newECMForm.FormClosed += (s, eArgs) => 
        {
            _cachedChildForms.Remove(typeof(FrmECM));
        };
        // 将新实例加入缓存和面板
        _cachedChildForms.Add(typeof(FrmECM), newECMForm);
        this.panelDesktop.Controls.Add(newECMForm);
        newECMForm.Show();
    }
}

关键细节说明

  • 用Dictionary<Type, Form>可轻松扩展到多类型子窗体,其他按钮事件只需替换typeof(FrmECM)为对应窗体类型即可
  • 绑定FormClosed事件是为了避免缓存中保留已关闭的无效实例,防止后续点击触发异常
  • 调用BringToFront()确保切换后的窗体显示在面板最上层

内容的提问来源于stack exchange,提问作者cdc22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:25:18