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

返回主窗体显示DateTime时遇System.StackOverflowException问题求助

问题分析

你遇到的System.StackOverflowException和计时器不显示问题,核心原因是关闭子窗体时新建了全新的Main窗体实例,而非复用之前隐藏的主窗体:

  • 重复创建Main实例会触发控件初始化逻辑的循环执行,最终引发栈溢出;
  • 新实例的计时器默认可能未启用,导致时间无法显示;
  • 原主窗体仅被隐藏并未销毁,重复创建实例会造成资源冗余。
解决方法

方法一:传递主窗体引用给子窗体(推荐)

  1. 修改主窗体的按钮点击事件,将当前主窗体实例传递给子窗体:
private void GestioneSerataButton_Click(object sender, EventArgs e)
{
    this.Hide();
    // 传入当前主窗体实例
    GestioneSerataForm gfor = new GestioneSerataForm(this);
    gfor.Show();
}
  1. 修改子窗体代码,保存主窗体引用并调整关闭逻辑:
// 保存主窗体引用
private Main _mainForm;

// 重载构造函数,接收主窗体实例
public GestioneSerataForm(Main mainForm)
{
    InitializeComponent();
    _mainForm = mainForm;
}

private void GestioneSerataForm_FormClosing(object sender, FormClosingEventArgs e)
{
    // 取消当前窗体关闭操作,改为隐藏
    e.Cancel = true;
    this.Hide();
    // 显示原主窗体
    _mainForm.Show();
}

方法二:通过应用程序窗体集合获取主窗体

若不想传递引用,可直接从Application.OpenForms中查找已存在的主窗体实例:

private void GestioneSerataForm_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = true;
    this.Hide();
    // 查找已打开的Main窗体实例
    Main mainForm = Application.OpenForms.OfType<Main>().FirstOrDefault();
    if (mainForm != null)
    {
        mainForm.Show();
    }
}
额外说明
  • 主窗体的计时器无需额外修改:主窗体隐藏时计时器仍在后台运行,再次显示会自动更新时间;
  • 保留主窗体的Main_FormClosing事件中的Application.Exit(),确保用户真正关闭主窗体时退出整个程序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 03:15:04