C#怎么打开同一个已经释放的窗体??

xxxxxxxiexiaoshuai 2013-03-11 11:33:45
都知道当一个子窗体被关闭(Close)后,在用Show()显示出来则会提示无法访问已释放的对象(子窗体名),现在怎么能做到在父窗体中可以重新打开这个以释放的窗体?
...全文
1376 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
dota_sky_god 2013-07-30
  • 打赏
  • 举报
回复



        public Form2 frm;//假设你要打开的窗体form2,设全局变量


///////////////////////////////////////以下是具体的打开窗体中的代码/////////////////////

            if (frm == null || frm.IsDisposed)
            {
                                frm = new Form2();
                frm.Visible = true;

            }
            else
            {
                frm.Visible = true;
            }
命运在我手中 2013-03-12
  • 打赏
  • 举报
回复
这么专业,看着眼花啊
  • 打赏
  • 举报
回复
关闭的时候用Hide()
leafmao 2013-03-11
  • 打赏
  • 举报
回复
你可以试试重新创建实例啊,先判断下窗体是否已经释放 先将窗体定义成类的成员

Fomr1 form1;//申明为类成员
//下列代码放在需要打开窗体那
if (form1 == null||form1 .IsDisposed )//先判断窗体实例是否存在
{
    form1 = new Form1();
    form1.Show();
 }
 else 
{
     form1.WindowState = FormWindowState.Normal;
     form1.Show();
}
lanymy 2013-03-11
  • 打赏
  • 举报
回复

        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();
        }
        
xxxxxxxiexiaoshuai 2013-03-11
  • 打赏
  • 举报
回复
刚试了一下,我把窗体声明为静态全局变量,可还是提示无法访问已释放的对象
gxingmin 2013-03-11
  • 打赏
  • 举报
回复
把那个窗体变量做成全局的,Close时不要Dispose
sololie 2013-03-11
  • 打赏
  • 举报
回复
瞬间石化
xxxxxxxiexiaoshuai 2013-03-11
  • 打赏
  • 举报
回复
引用 37 楼 sololie 的回复:
将closing中把将要close的窗体及其拥有的控件状态序列化,再new一个时恢复其状态
不需要啦,直接用这个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(); } 这样就可以打开被关闭的床体了
sololie 2013-03-11
  • 打赏
  • 举报
回复
将closing中把将要close的窗体及其拥有的控件状态序列化,再new一个时恢复其状态
xxxxxxxiexiaoshuai 2013-03-11
  • 打赏
  • 举报
回复
引用 35 楼 xxxxxxxiexiaoshuai 的回复:
实现了在MouseMove事件中打开已经关闭的窗体
当鼠标放在陈明上时new出第一个窗体,当放在张亮上时会先把第一个窗体Close掉然后在new出一个同一个窗体,因为事件很短,所有感觉是连续的
xxxxxxxiexiaoshuai 2013-03-11
  • 打赏
  • 举报
回复
实现了在MouseMove事件中打开已经关闭的窗体
xxxxxxxiexiaoshuai 2013-03-11
  • 打赏
  • 举报
回复
也是实现了,但是效果还不是太好,正在用switch来判断获得的行号,因为MouseMove中我每移动一次,都会新创建一个窗体,这样就会在每个单元格中创建出很多重复的窗体,正在修改这个问题
leafmao 2013-03-11
  • 打赏
  • 举报
回复
引用 13 楼 xxxxxxxiexiaoshuai 的回复:
引用 4 楼 leafmao 的回复:你可以试试重新创建实例啊,先判断下窗体是否已经释放 先将窗体定义成类的成员 C# code?123456789101112Fomr1 form1;//申明为类成员//下列代码放在需要打开窗体那if (form1 == null||form1 .IsDisposed )//先判断窗体实例是否存在{ form1 = new Fo……
在MouseMove事件中怎么就复杂了呢。。。我做的是在MouseClick事件中,你这个也可以类似处理啊
xxxxxxxiexiaoshuai 2013-03-11
  • 打赏
  • 举报
回复
我自己也搞懵了,不好搞,其实就是当鼠标放在姓名那一行的每个单元格时出现一个悬浮框,只是数据不好搞,要根据那一行的姓名然后从数据库中获取,所有最难的还是在获取数据上
lanymy 2013-03-11
  • 打赏
  • 举报
回复
我看的比较混乱 你等等别人的回复吧
xxxxxxxiexiaoshuai 2013-03-11
  • 打赏
  • 举报
回复
不行的,已经规定了弹出的窗体不可变,所以不能用VisibleChanged 事件绑定数据 ,而且公司客户端使用C#写的,处理数据代码是用Java写的,通过WebService调用的,数据传送是通过XML语句,把数据作为一个节点进行传送的,所有最简单的还是通过Dev控件GridView的鼠标事件根据坐标来设置关闭和打开窗体,现在这个控件规定显示5行,多于5行则会出现下拉控件所有坐标也好容易判断,而且每个单元格高度是20,如果是第一个我就规定高度在(47,19)之间47是第一个单元格的上坐标,则第二个单元格规定高度在(68,87)之间,然后它们中间的那几个单位设置窗体关闭,其余的都为打开
lanymy 2013-03-11
  • 打赏
  • 举报
回复
三方控件 都会公开出 数据源 属性 和 数据更新通知事件 这样 直接new 一个新的出来 重新绑定 数据源 不就更新了? 就不用在它上面 维护数据状态了
lanymy 2013-03-11
  • 打赏
  • 举报
回复
弹出框窗体 公开出 鼠标坐标 id 属性 mouseover 事件里 把坐标 和id 传进去 然后show 弹出框窗体 VisibleChanged 事件绑定数据
xxxxxxxiexiaoshuai 2013-03-11
  • 打赏
  • 举报
回复
这个控件是DevExpress的GridView 控件
加载更多回复(21)

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧