我想在一个窗口FROM1调用另一个FROM2,为了让FROM2只生成一个,所以我使用了单例模式。在FROM2中有一个取消的BUTTON。
当然,FROM2会自动在右上角有一个关闭的(小叉叉)。现在我在取消的按钮上设定了事件:
    this.setVisible=false;如果是this.Dispose()。则会出异常,异常为:第2次再在FROM1当中调用FROM2的时候就找不到FROM2的实例。点了FROM2的关闭也是一样。请高手指教。代码在家里机器上。如有需要再贴代码。谢谢!
   

解决方案 »

  1.   

    1.调用Dispose当然就找不到实例了 必须再生成实例才行 必须使用Visiable属性
    2.响应Closing事件 取消closing并且设为Invisiable
      

  2.   

    这是From1中调用窗口的按钮事件:
    private void llblId_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
            {            if (RegisterForm.getInstance() != null)
                {
                    RegisterForm registerForm = RegisterForm.getInstance();
                    registerForm.Show();
                    registerForm.Select();
          
                }
                else
                {
                    MessageBox.Show("系统忙,请稍候再试!");
                }这是from2的构造方法代码:
    public partial class RegisterForm : Form
        {        private static RegisterForm registerForm_instance = null;
            //返回类对象的唯一实例,以使注册的窗口只产生一个
            public static RegisterForm getInstance()
            {
               
                if (registerForm_instance == null)
                {
                    registerForm_instance = new RegisterForm(); //!!出异常的地方
                }
                return registerForm_instance;        }        private RegisterForm()
            {
                InitializeComponent();
            }
      这样之后,在from1中点button的时候没有问题,达到了只实例化一个from2的目的。但是当我在from2中点这个窗体的叉叉
    之后from2被关闭。再去from1中点击button的时候,就会出异常(位置见代码注释)。请高手指教。
      

  3.   

    方法一:
    按你的方法,在Form2中
    private void RegisterForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        registerForm_instance = null;
    }方法二:
    在Form1中
    RegisterForm f2 = null;
    private void button3_Click(object sender, EventArgs e)
    {
        if (f2 == null || f2.IsDisposed)
        {
            f2 = new RegisterForm();
            f2.Show();
        }
        else
        {
            f2.Activate();
        }
    }
    在Form2中不用添加任何额外的代码
      

  4.   

    谢谢高手回答,root_(千年) 的两个解决方法试过
    异常V************** 异常文本 **************
    System.ObjectDisposedException: 无法访问已释放的对象。
    对象名:“RegisterForm”。-------------------------------
     RegisterForm register = null;
            private void llblId_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
            {
                if(register ==null || register.IsDisposed)
                {
                    register = RegisterForm.getInstance();
                    register.Show();
                    register.Select();
                }
                else
                {
                    register.Activate();
               
                }
      

  5.   

    这个,非要按你的方式写才行吗?
    RegisterForm register = null;
    private void button3_Click(object sender, EventArgs e)
    {
        if (register == null || register .IsDisposed)
        {
            register = new RegisterForm();
            register .Show();
        }
        else
        {
            register .Activate();
        }
    }这种方法,就不用RegisterForm.getInstance();了
    在Form1中写上面的代码,在Form2中,把下面的代码删除
    private   static   RegisterForm   registerForm_instance   =   null; 
    //返回类对象的唯一实例,以使注册的窗口只产生一个 
    public   static   RegisterForm   getInstance() 

          
            if   (registerForm_instance   ==   null) 
            { 
                    registerForm_instance   =   new   RegisterForm();   //!!出异常的地方 
            } 
            return   registerForm_instance; }
      

  6.   

    5楼的两个办法试过了,问题照旧!
    请问3楼Macosx(咋就不结贴呢) ()发表于:2007-11-26 12:25:063楼 得分:0
    1.调用Dispose当然就找不到实例了 必须再生成实例才行 必须使用Visiable属性
    2.响应Closing事件 取消closing并且设为Invisiable
    第2条如何实现?我是菜鸟,请指点指点,谢谢!
      

  7.   

    7楼的方法刚试过了,完全OK!谢谢。
    刚想试试单例模式就照搬过来了,为什么7楼的方法可以,而我的方法不行呢?奇怪.
    不过非常感谢root(千年)!
      

  8.   

    Closing事件参数e里有个Cancel属性,设为true就是取消Closing了。
      

  9.   

     registerForm.Show(); 
    改成 registerForm.ShowDialog(); 就可以了
      

  10.   

    danjiewu 
    阿丹 
    等 级:
     发表于:2007-11-26 16:33:2611楼 得分:0 
    Closing事件参数e里有个Cancel属性,设为true就是取消Closing了。 
     
     
     
      

  11.   

    registerForm.Show();   
    改成   registerForm.ShowDialog();   就可以了