无法访问已处理的对象问题

本文关键字:对象 问题 处理 访问 | 更新日期: 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;
    }
}