返回主窗体显示DateTime时遇System.StackOverflowException问题求助
问题分析
你遇到的System.StackOverflowException和计时器不显示问题,核心原因是关闭子窗体时新建了全新的Main窗体实例,而非复用之前隐藏的主窗体:
- 重复创建Main实例会触发控件初始化逻辑的循环执行,最终引发栈溢出;
- 新实例的计时器默认可能未启用,导致时间无法显示;
- 原主窗体仅被隐藏并未销毁,重复创建实例会造成资源冗余。
解决方法
方法一:传递主窗体引用给子窗体(推荐)
- 修改主窗体的按钮点击事件,将当前主窗体实例传递给子窗体:
private void GestioneSerataButton_Click(object sender, EventArgs e) { this.Hide(); // 传入当前主窗体实例 GestioneSerataForm gfor = new GestioneSerataForm(this); gfor.Show(); }
- 修改子窗体代码,保存主窗体引用并调整关闭逻辑:
// 保存主窗体引用 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
相关产品推荐
相关产品推荐

