无法访问已处置的对象?

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

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; } 

任何人都可以帮助我 – 如果需要,我可以发布UpdateLabelsfunction。 我是UI C#开发的新手,所以任何帮助都会很棒。 谢谢。

问题是,不能再使用封闭的表格(重新打开)。 这就是为什么你发布的代码试图停止关闭,只隐藏你的窗口。 但为此,Cancel-property必须设置为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(); 

和_Minforms类似

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

 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(); } 

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

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