无法访问已处置的对象?

时间:2011-08-09 08:34:42

标签: c# .net winforms forms

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

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

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

                UpdateLabels();
            }

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

    private void Max_FormClosing(object sender, FormClosingEventArgs e)
    {
        this.Hide();
        this.Parent = null;
    }

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

6 个答案:

答案 0 :(得分:4)

问题是,关闭的表格不能再使用(重新开放)。这就是为什么你发布的代码试图停止关闭,只隐藏你的窗口。但为此,必须将Cancel-property设置为true:

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

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

然而,这可能只是一种解决方法,您可以使用其他设计解决问题。 也许明智的做法是,每次需要时创建表单的新实例,而不是每次都尝试重新打开它。这样做的另一个好处是,如果确实需要,表单只会请求资源。

答案 1 :(得分:4)

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

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

_Max.Show();

和_Min表格类似

答案 2 :(得分:1)

每当表单关闭时,释放所有资源。这意味着您不能再访问该对象,因为它不再存在 - 它已被释放并从内存中删除。为了防止这种情况发生,您可以取消关闭表单,然后隐藏它(这对用户来说是透明的)。

this.Hide();        
e.Cancel=true;

您的代码的更新版本如下:

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

答案 3 :(得分:0)

解决方案很简单,例如在按钮点击事件中实例化被调用表单的对象。

private void buttonSetting_Click( object sender, EventArgs e )
    {
        ***_setting = new SettingWindow();***  //When I need to show the settings window

        _setting.Show();
    } 

答案 4 :(得分:0)

如果对象不可用,则创建新的状态

if(frmRGB == nullptr || frmRGB.IsDisposed == true) { frmRGB = new Form(); }

答案 5 :(得分:-1)

在按钮单击事件内创建对象 像这样

private void btn_supplier_order_Click(object sender, EventArgs e)
        {
            form_supplier_order so = new form_supplier_order();
            so.Show();
        }