无法访问已处置的对象?
我有一个倒数计时器表格 – 在第一个表格上,用户将输入倒计时时间 – 警告时间,结束消息等。还有两个单选按钮(最大/最小),根据选择哪个,他们将打开一个新的最大或最小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(); }