无法访问已处置的对象
本文关键字:对象 访问 | 更新日期: 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();
}