C#中关闭子窗口而不释放子窗口对象的方法
程序员文章站
2022-05-13 23:36:07
1 在主窗口中实例化子窗口 在主窗口中实例化子窗口,而不是在按钮中实例化子窗口对象。 2 通过按钮来显示主窗口 在按钮中需要实现的是窗口的显示 3 关闭子窗口而不释放子窗口对象的方法 4 在父窗口关闭时销毁子窗口对象 由于需要在父窗口关闭是销毁子窗口对象,因此,在父窗口的关闭动作FormClosed ......
1 在主窗口中实例化子窗口
在主窗口中实例化子窗口,而不是在按钮中实例化子窗口对象。
form2 f2 = new form2();
2 通过按钮来显示主窗口
在按钮中需要实现的是窗口的显示
private void config_click(object sender, eventargs e) { f2.show(); }
3 关闭子窗口而不释放子窗口对象的方法
经查询和实证,修改子窗口中dispose(在子窗口设计器中寻找修改)的方法是可行的。更改如下:
protected override void dispose(bool disposing) { hide(); //if (disposing && (components != null)) //{ // components.dispose(); //} //base.dispose(disposing); }
4 在父窗口关闭时销毁子窗口对象
由于需要在父窗口关闭是销毁子窗口对象,因此,在父窗口的关闭动作formclosed中添加调用子窗口f2的销毁函数。
private void form1_formclosed(object sender, formclosedeventargs e) { f2.close(); }
子窗口类中添加的关闭函数如下:
public void close() { this.dispose(); }
出处:
----------------------------------------------------------------------------------------------------------
另外还有一种方式:
子窗体定义一个委托,父窗体实例化子窗体时注册子窗体的委托事件(具体功能是实现父窗口的控件变化),子窗体关闭时调用事件方法。
父窗体
public void showpopwindow() { testa sub = new testa(); sub.closewindow += new action(sub_closewindow); sub.show(); } void sub_closewindow() { //改变父窗体控件内容 }
子窗体
public class testa { public event action closewindow; protected virtual void onclosewindow() { action handler = closewindow; if (handler != null) handler(); } //子窗体关闭事件 private void closesubwindow() { onclosewindow(); } }
出处:
------------------------------------------------------------------------------------------------------------------
根据上面的说明,我们自己实现自己的功能,我的功能其实很简单,就一行代码,释放资源,
form2 fui = null; private void button1_click(object sender, eventargs e) { if (fui == null) fui = new useruserinfo(); fui.mdiparent = this; fui.formclosed += delegate(object obj, formclosedeventargs arg) { fui = null; }; fui.show(); fui.activate(); }
但需要注意,在 fui.formclosed += delegate(object obj, formclosedeventargs arg) { fui = null; };中使用的参数,不要和按钮事件中参数名相同,注意参数冲突。
出处:
上一篇: 网上下了个病毒