无法访问已处置的对象

本文关键字:对象 访问 | 更新日期: 2023-09-27 18:04:48

我有一个倒计时定时器表单-在第一个表单上用户将输入倒计时时间-警告时间,结束消息等。也有两个单选按钮(最大/最小),并根据选择,他们将打开一个新的最大或最小的形式,时间将开始倒计时。它工作良好,如我所料倒计时。但是,如果我退出最大或最小形式,并尝试再次运行新的时间,我得到错误。代码如下-注意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#开发非常陌生,所以任何帮助都会很棒。谢谢。

无法访问已处置的对象

问题是,一个封闭的表单不能再使用(被重新打开)。这就是为什么你张贴的代码试图停止关闭,只隐藏你的窗口。但要做到这一点,cancel -属性必须设置为true:

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

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

然而,这可能只是一个变通办法,你可以用另一种设计来解决问题。也许这将是明智的,创建一个新的实例的形式,每次你需要它,而不是试图重新打开它每次。这样做还有一个好处,即表单只在真正需要时才需要资源。

在调用。show方法之前添加以下检查:

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

和_Min form

类似

当窗体关闭时,所有的资源将被释放。这意味着您不能再访问该对象,因为它不再存在——它已被释放并从内存中删除。为了防止这种情况,您可以取消窗体的关闭,并将其隐藏(这将对用户显示透明)。

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

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

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

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

private void buttonSetting_Click( object sender, EventArgs e )
    {
        ***_setting = new SettingWindow();***  //When I need to show the settings window
        _setting.Show();
    } 
如果对象不可用

创建新的实例

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

在按钮点击事件中创建对象这样的

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