无法访问已处置的对象?

Ctr*_*eat 7 .net c# forms winforms

我有一个倒数计时器表格 - 在第一个表格上,用户将输入倒计时时间 - 警告时间,结束消息等.还有两个单选按钮(最大/最小),根据选择哪个,他们将打开一个新的最大值或最小形式,时间实际上将开始倒计时.它正常工作并按照我的预期倒计时.但是,如果我退出Max或Min形式并尝试再次运行新的时间,我会收到错误.代码如下 - 注意注释掉.ShowDialog(this); 是我试过的东西 - 它让我关闭并打开新表格确定但它实际上并没有开始倒计时.UpdateLabels是用于更新标签的功能.

                bool Max = rbMax.Checked;
                if (Max == true)
                {
                    //_Max.ShowDialog(this);
                    _Max.Show();

                }
                else
                    //_Min.ShowDialog(this);
                    _Min.Show();

                UpdateLabels();
            }
Run Code Online (Sandbox Code Playgroud)

我也尝试了以下在线阅读作为可能的解决方案,但它也没有工作....

    private void Max_FormClosing(object sender, FormClosingEventArgs e)
    {
        this.Hide();
        this.Parent = null;
    }
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我 - 如果需要,我可以发布UpdateLabels功能.我对UI C#开发很陌生,所以任何帮助都会很棒.谢谢.

HCL*_*HCL 7

问题是,不能再使用关闭的表单(重新打开)。这就是为什么您发布的代码试图停止关闭并仅隐藏您的窗口。但是要做到这一点,必须将 Cancel-property 设置为 true:

private void Max_FormClosing(object sender, FormClosingEventArgs e)    {        
   this.Hide();        
   this.Parent = null;    
   e.Cancel=true;
}
Run Code Online (Sandbox Code Playgroud)

要以这种方式关闭窗体后显示它,请使用 Show() 方法显示它。

但是,这可能只是一种解决方法,您可以使用另一种设计来解决问题。 也许明智的做法是在每次需要时创建表单的新实例,而不是每次都尝试重新打开它。这也有一个优点,即表单仅在确实需要时才需要资源。


Waq*_*qas 7

您可以做的是在调用 .Show 方法之前添加以下检查:

if(_Max == null || _Max.IsDisposed)
    _Max = new MaxForm();       

_Max.Show();
Run Code Online (Sandbox Code Playgroud)

和 _Min 形式类似