情况:我使用单例模式,使同一时刻只能有一个DgvForm窗体实例运行
以下是DgvForm中的关键代码:C# code    public partial class DgvForm : Form { private static DgvForm instance=null; public static DgvForm Instance { get { if (instance == null) instance = new DgvForm(); return instance; } } }
调用时使用C# code    private void btnDgv_Click(object sender, EventArgs e) { DgvForm.Instance.Show(); DgvForm.Instance.BringToFront(); }
这样可以使同一时刻只有一个DgvForm实例在运行
我试了几次,发现一个问题:
点击btnDgv_Click一次,显示出DgvForm窗体,没有问题
再次点击btnDgv_Click一次,显示出刚才的DgvForm窗体,没有问题
把DgvForm事例关闭,再次点击btnDgv_Click,出错!
以下是错误信息:
--------------------------------------------------------------------------------------------------------------
未处理 System.ObjectDisposedException
  Message="无法访问已释放的对象。\r\n对象名:“DgvForm”。"
--------------------------------------------------------------------------------------------------------------
求大侠门指教.

解决方案 »

  1.   

    不要做真的关闭,可以再FormClosing事件中改成Hide()之后做e.cancel=true,也就是,假关闭!呵呵,另一种做法就是在静态方法实例化对象之前先做判断,不用多说了吧!
      

  2.   

    学习 
    第一次看到具体的单例模式!
    yulitian 很热心。。
      

  3.   

    我不会判断
    窗体被释放了,再次引用 时instance不就是null吗?为什么会出现那样的错误?
      

  4.   

    加上 OR instance.IsDisposed
      

  5.   

    if (instance == null || instance.Isdisposed) instance = new DgvForm();窗体被释放了,这儿你说的释放是指释放了非托管资源,就是不受.net Framework控制的资源,如IO,FileStream,打印机资源啊等等,此时的窗体实例并不是null你可以自己试试
    Form a = new Form();
    a.Dispose();
    If(a==null)
    Console.WriteLine("a is null");
    else
    Console.WriteLine("a is not null");