C#在父窗口中调用子窗口的过程: 1、 创建子窗口对象 2、 显示子窗口对象 如图所示,点击Form1中的按钮,打开ChildFrm窗体。
第一种方案:
private void btnOpenChildFrm_Click(object sender, EventArgs e) { ChildFrm childFrm = new ChildFrm(); childFrm.Show(); }
这种方法的可以实现子窗体的打开,但是每次点击按钮都可以打开一个子窗体。
我们有时候需要的是这样一种情况:
点击按钮打开一个子窗体,如果子窗体已经打开,则不再创建子窗体。也就是说只能打开一个子窗体,不能重复打开多个子窗体。
第二种方案:
ChildFrm childFrm = null; private void btnOpenChildFrm_Click(object sender, EventArgs e) { if (childFrm != null) { childFrm.Show(); } else { childFrm = new ChildFrm(); childFrm.Show(); } }
这样做,当打开一个子窗体后,在不关闭子窗体的情况下,再次点击“打开子窗体”按钮,不会再重新打开子窗体。
但是当子窗体关闭后,再点击“打开子窗体”按钮发生报错。错误信息如下:
这就让人奇怪了。如果子窗口没有被销毁,那它就应该能够正确显示。点击了关闭子窗口,显然应该子窗口已经销毁了,按理ChildFrm等于null,运行的时候应该直接运行else后面的语句块,为什么却进入了满足myChildFrm!=null的语句块呢?
参考“从小处看C#.net垃圾回收”一文。
这里报错的问题主要是,ChildFrm已经关闭且回收,但是ChildFrm并不等于Null的问题。解决方法如下:
ChildFrm childFrm = null; private void btnOpenChildFrm_Click(object sender, EventArgs e) { if (childFrm != null) { if (childFrm.IsDisposed) { childFrm = new ChildFrm(); } childFrm.Show(); } else { childFrm = new ChildFrm(); childFrm.Show(); } }
将两个if语句也做一下简化,如下:
ChildFrm childFrm = null; private void btnOpenChildFrm_Click(object sender, EventArgs e) { if (childFrm == null || childFrm.IsDisposed) { childFrm = new ChildFrm(); childFrm.Show(); } else { childFrm.Show(); } }
标签:ChildFrm,Show,每次,打开,childFrm,窗体,null,WinForm From: https://www.cnblogs.com/hanzq/p/16978697.html