无法访问已处理的对象问题
本文关键字:对象 问题 处理 访问 | 更新日期: 2023-09-27 18:00:36
我有一个通过单击按钮显示的表单。当我第二次点击按钮时,我又收到了一张表格。所以我想防止它,也就是说,我想一次只显示一个窗体的实例。我曾尝试使用一个单例:
public partial class MyForm : Form
{
private static Object _mutex = new Object();
private static MyForm _instance = null;
public static MyForm GetInstance(...params...)
{
if (_instance == null)
{
lock (_mutex)
{
if (_instance == null)
{
_instance = new MyForm(..params..);
}
}
}
return _instance;
}
}
并称之为:
private MyForm Form {set;get;}
private void MyButtonClick(object sender, EventArgs e)
{
Form = MyForm.GetInstance(...params...);
if (!Form.Visible)
Form.Show();
}
点击按钮后,我得到一个表格。在我关闭它并再次点击按钮之后,结果我得到了一个错误:
系统。ObjectDisposedException:无法访问已释放的对象
对象名称:"MyForm"。
我做错了什么?也许我不需要单身,有其他方法吗?
已关闭、已处置且无法重新拥有的表单。实例变量必须重置为null,或者表单必须防止自身关闭和隐藏。
例如
protected override void OnFormClosed(FormClosedEventArgs e)
{
_instance = null;
base.OnFormClosed(e);
}
只设置一个变量来控制表单是否打开不是更容易吗?我一直都是这样做的,每当我想在一个窗体中的多个窗口上做这件事时,我都会用它做一个数组,例如:
if(!isOpen[0]) {
isOpen[0]=true;
Form.Show;
}
为此,您使isOpen可供其他窗体访问,然后当您关闭有问题的窗体时,您使用Closing
事件将其中的变量设置回false。
使用Ispostback
方法。。
public partial class MyForm : Form
{
private static Object _mutex = new Object();
private static MyForm _instance = null;
public static MyForm GetInstance(...params...)
{
if (_instance == null)
{
lock (_mutex)
{
if (Ispostback)
{
_instance = new MyForm(..params..);
}
}
}
return _instance;
}
}