C# 关闭表单时System.ObjectDisposedException

C# 关闭表单时System.ObjectDisposedException,c#,winforms,C#,Winforms,我有一个windows应用程序,它有一个主窗体(主屏幕)和许多子窗体 关闭子窗体并从主窗体再次回调时,将发生System.ObjectDisposedException异常 下面列出了我的屏幕代码: 调用子窗体的主屏幕代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;

我有一个windows应用程序,它有一个主窗体(主屏幕)和许多子窗体

关闭子窗体并从主窗体再次回调时,将发生System.ObjectDisposedException异常

下面列出了我的屏幕代码:

调用子窗体的主屏幕代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Application
{
    public partial class Home : Form
    {

        private void Businesslogic_button_Click(object sender, EventArgs e)
        {
            BusinessRules.Show();
        }

    }
}
用于处理对象的子窗体设计器.CS代码:

protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
        components.Dispose();
    }

    base.Dispose(disposing);
}
表单关闭事件的子表单.CS代码:

bool formClosing false; 
private void BusinessRules_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (formClosing) return;
        e.Cancel = true;
        Timer Tmr = new Timer();
        Tmr.Tick += Tmr_Tick;
        Tmr.Start();
        formClosing = true;
    }

    void Tmr_Tick(object sender, EventArgs e)
    {
        ((Timer)sender).Stop();
        this.Close();
    }

在Subform.CS中尝试此操作:

    private void Subform_FormClosing( object sender, FormClosingEventArgs e )
    {
        e.Cancel = true;
        this.Hide();
    }

如果需要存储表单的状态,只需调用Hide()方法并设置e.Cancel=true。然后再次调用表单变量上的Show()以重新打开它


如果不想保留状态,只需关闭表单即可。然后从主页打开表单的新实例。

业务规则\u FormClosing
中计时器的作用是什么?此外,您不会在发布的任何代码中显示如何关闭和重新打开子表单。您在哪里创建
业务规则?我怀疑您在某个地方创建了它一次,比如
Home\u Load
,然后每次都使用相同的实例。由于您正在关闭
BusinessRules
表单,而不是将其隐藏,因此它将被释放,然后您将在已释放的表单上调用
Show()
form@Rhumborl:是的,我正在主窗体加载中创建业务规则。。。正在处理它,我正在调用show()方法。。。。对不起,我是新来的。。。我该如何解决这个问题?您是否真的在实际代码中使用相同的方法创建计时器?简单地创建和停止计时器不会解决任何问题!您阅读的建议肯定与停止已经运行的计时器有关。我知道这段代码将隐藏表单。。。但是不要关闭它。。。。当我再次单击表单时,它将打开它的上一个会话中的值。您好。。。只是一个简单的问题。。。。如何在每次关闭子窗体时为其创建新实例?我想你已经在你的主表单中有了代码?如
var businessRulesForm=new businessRulesForm();businessRulesForm.Show()