都知道当一个子窗体被关闭(Close)后,在用Show()显示出来则会提示无法访问已释放的对象(子窗体名),现在怎么能做到在父窗体中可以重新打开这个以释放的窗体?c#窗体

解决方案 »

  1.   

    把那个窗体变量做成全局的,Close时不要Dispose
      

  2.   


            private ShowWindow _ShowWindow;        public Window5()
            {
                InitializeComponent();
                this.Loaded += new RoutedEventHandler(Window5_Loaded);
                this.Unloaded += new RoutedEventHandler(Window5_Unloaded);
            }        void Window5_Unloaded(object sender, RoutedEventArgs e)
            {
                if (_ShowWindow!=null)
                {
                    _ShowWindow = null;
                }
            }        void BtnShowWindow(object sender,RoutedEventArgs e)
            {
                if (_ShowWindow == null)
                {
                    _ShowWindow = new ShowWindow();
                }
                _ShowWindow.Show();
            }
            
      

  3.   

    你可以试试重新创建实例啊,先判断下窗体是否已经释放
    先将窗体定义成类的成员Fomr1 form1;//申明为类成员
    //下列代码放在需要打开窗体那
    if (form1 == null||form1 .IsDisposed )//先判断窗体实例是否存在
    {
        form1 = new Form1();
        form1.Show();
     }
     else 
    {
         form1.WindowState = FormWindowState.Normal;
         form1.Show();
    }
      

  4.   

    刚试了一下,怎么不可编译呢using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;namespace WindowsDemo
    {
        public partial class Window5 : Form
        {
            private Form2 _ShowWindow;
            public Window5()
            {
                InitializeComponent();
                this.Loaded += new RoutedEventHandler(Window5_Loaded);
                this.Unloaded += new RoutedEventHandler(Window5_Unloaded);
            }
       
            private void button1_Click(object sender, EventArgs e)
            {        }
            void Window5_Unloaded(object sender, RoutedEventArgs e)
            {
                if (_ShowWindow != null)
                {
                    _ShowWindow = null;
                }
            }        void BtnShowWindow(object sender, RoutedEventArgs e)
            {
                if (_ShowWindow == null)
                {
                    _ShowWindow = new Form2();
                }
                _ShowWindow.Show();
            }
        }
    }
      

  5.   

    Hide只是隐藏,而我要的是释放窗体
      

  6.   

    是不是Form2里在窗体关闭事件里写什么东西了?
      

  7.   

    释放了又要再显示,那就只有new一个了,那样的话,控件状态什么的都丢了
      

  8.   

    我了个去 我这是随便用wpf  给你写的例子  跟winform  代码是比较类似的 你自己换下呀...
      

  9.   

    private Form2 _ShowWindow;        public Form1()
            {
                InitializeComponent();
                this.FormClosed += new FormClosedEventHandler(Form1_FormClosed);
            }        void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                if (_ShowWindow != null)
                {
                    _ShowWindow.Dispose();
                    _ShowWindow = null;
                }
            }        private void button1_Click(object sender, EventArgs e)
            {
                if (_ShowWindow == null)
                {
                    _ShowWindow = new Form2();
                }
                _ShowWindow.Show();
            }
    winform的
      

  10.   

    刚试了,是可以实现重新生成已释放的窗体,但我的窗体要在MouseMove事件中生成,这就复杂了
      

  11.   

       public partial class Form1 : Form
        {
            private Form2 _ShowWindow;        public Form1()
            {
                InitializeComponent();
                this.FormClosed += new FormClosedEventHandler(Form1_FormClosed);
            }        void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                if (_ShowWindow != null)
                {
                    _ShowWindow.Dispose();
                    _ShowWindow = null;
                }
            }        private void button1_Click(object sender, EventArgs e)
            {
                if (_ShowWindow == null)
                {
                    _ShowWindow = new Form2();
                }
                _ShowWindow.Show();
            }
        }
      

  12.   

    是啊,问题卡在这里了,怎么能在Close一个窗体的时候在new一个窗体出来 
      

  13.   

    private Form2 _ShowWindow;
    声明一个页面级别的全局私有变量
    如果要维护弹出框窗体的状态 不显示的时候 用hide() 方法  别用close 
      

  14.   

    不行的,因为我一定要Close掉这个窗体才能继续做下面的操作,如果不关闭只是隐藏就不能继续操作了
      

  15.   

    我现在要做的首先是显示一个窗体,当我鼠标放在一个控件上时就Close这个窗体,不能隐藏不然就不能继续操作了,然后当鼠标再放到这个控件上时重新new 出来刚才关闭的窗体
      

  16.   

       Form2 f;
            private void button3_MouseEnter(object sender, EventArgs e)
            {
                if (f == null || f.IsDisposed)//先判断窗体实例是否存在
                {
                    f = new Form2();
                    f.Show();
                   
                }
                else
                {
                    f.WindowState = FormWindowState.Normal;
                    f.Show();
                }
            }        private void button3_MouseLeave(object sender, EventArgs e)
            {
                button2_Click(null, null);
            }
           刚试了一下,这个方法可以实现的,不知道在DevExpress的GridView中能不能实现了
      

  17.   

    是啊,和那个差不多,不过我是在dataGridView控件中操作,当我鼠标移到第一个表格时创建这个窗体,离开第一个表格到第二个表格时,首先关闭这个窗体,然后再把这个窗体给new出来,因为这个窗体是用来显示数据的,所有每次new 窗体时都要从数据库中获取一次数据,所以不能隐藏,只能关闭才行
      

  18.   

    怎么就不能隐藏了?
    把数据更新事件写到  VisibleChanged 里去不行?  这样不就执行数据绑定了??
      

  19.   

    非得把数据绑定事件写到loaded里去?
      

  20.   

    那个窗体是已经写好的了,我调用就行了,现在我就是用鼠标事件根据坐标判断就行了,,现在已经视线了在两个按钮中Close和new同一个床体了,可以把两个单元格想象成这两个button按钮,然后根据鼠标获得的坐标判断一下位置就行了,这样的话就不需要更改这个窗体了
      

  21.   

    这个控件是DevExpress的GridView 控件
      

  22.   

    弹出框窗体 公开出 鼠标坐标  id 属性
    mouseover 事件里  把坐标 和id 传进去  然后show
    弹出框窗体 VisibleChanged  事件绑定数据
      

  23.   

    三方控件 都会公开出 数据源 属性 和 数据更新通知事件 
    这样 直接new 一个新的出来  重新绑定 数据源 不就更新了? 
    就不用在它上面 维护数据状态了
      

  24.   

    不行的,已经规定了弹出的窗体不可变,所以不能用VisibleChanged  事件绑定数据 ,而且公司客户端使用C#写的,处理数据代码是用Java写的,通过WebService调用的,数据传送是通过XML语句,把数据作为一个节点进行传送的,所有最简单的还是通过Dev控件GridView的鼠标事件根据坐标来设置关闭和打开窗体,现在这个控件规定显示5行,多于5行则会出现下拉控件所有坐标也好容易判断,而且每个单元格高度是20,如果是第一个我就规定高度在(47,19)之间47是第一个单元格的上坐标,则第二个单元格规定高度在(68,87)之间,然后它们中间的那几个单位设置窗体关闭,其余的都为打开
      

  25.   


    在MouseMove事件中怎么就复杂了呢我做的是在MouseClick事件中,你这个也可以类似处理啊
      

  26.   

    也是实现了,但是效果还不是太好,正在用switch来判断获得的行号,因为MouseMove中我每移动一次,都会新创建一个窗体,这样就会在每个单元格中创建出很多重复的窗体,正在修改这个问题
      

  27.   

    实现了在MouseMove事件中打开已经关闭的窗体
      

  28.   

    当鼠标放在陈明上时new出第一个窗体,当放在张亮上时会先把第一个窗体Close掉然后在new出一个同一个窗体,因为事件很短,所有感觉是连续的
      

  29.   

    将closing中把将要close的窗体及其拥有的控件状态序列化,再new一个时恢复其状态
      

  30.   

    不需要啦,直接用这个if语句判断一下就行了   if (f == null || f.IsDisposed)//先判断窗体实例是否存在
                {
                    f = new Form2();
                    f.Show();
                   
                }
                else
                {
                    f.WindowState = FormWindowState.Normal;
                    f.Show();
                }关闭的时候最好也判断一下,我用的是if (f != null || !f.IsDisposed)//先判断窗体实例是否存在
                           {
                               f.Show();
                           }
    这样就可以打开被关闭的床体了
      

  31.   


            public Form2 frm;//假设你要打开的窗体form2,设全局变量
    ///////////////////////////////////////以下是具体的打开窗体中的代码/////////////////////            if (frm == null || frm.IsDisposed)
                {
                                    frm = new Form2();
                    frm.Visible = true;            }
                else
                {
                    frm.Visible = true;
                }