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

时间:2014-04-29 08:58:16

标签: c# winforms

我有一个表单,我通过按钮点击显示。当我第二次点击按钮时,我再次收到一个表格。所以我想要阻止它,也就是说,我想一次只显示一个表单的实例。我试过使用singleton

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

点击按钮后,我会收到一张表格。关闭它并再次单击该按钮后,在结果中出现错误:

  

System.ObjectDisposedException:无法访问已处置的对象。
  对象名称:'MyForm'。

我做错了什么?也许我不需要单身,还有其他办法吗?

3 个答案:

答案 0 :(得分:3)

关闭的表单已被处理,无法重新显示。实例变量必须重置为null,否则表单必须阻止自己关闭并隐藏自己。

e.g。

protected override void OnFormClosed(FormClosedEventArgs e)
{
    _instance = null;
    base.OnFormClosed(e);
}

答案 1 :(得分:1)

设置一个控制表单是否打开的变量不是更容易吗? 我一直这样做,每当我想在一个窗体中的多个窗口上做它时,我就用它做一个数组,例如:

if(!isOpen[0]) {
   isOpen[0]=true;
   Form.Show;
}

为此,您可以通过其他表单访问isOpen,然后当您关闭相关表单时,使用Closing事件将变量从那里设置为false。

答案 2 :(得分:0)

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