C#关闭子窗口而不释放子窗口对象的问题解决

在网上找来一些方式,感受还都不错,下面给出方式:html

在线扫描相机的调试过程当中,须要开辟调试界面来进行位置的配置。调试结束后,一种经常使用的方式是将调试参数保存并在下次启动时加载。另外一种简单方式是直接使用该参数运行程序。所以,在后一种状况下,须要实现的功能是:即便关闭调试窗口,其窗口对象也不释放。除非其主窗口关闭,才销毁其调试窗口的对象。markdown

1 在主窗口中实例化子窗口

  在主窗口中实例化子窗口,而不是在按钮中实例化子窗口对象。ide

 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的销毁函数。ui

private void Form1_FormClosed(object sender, FormClosedEventArgs e) { f2.Close(); } 

  子窗口类中添加的关闭函数以下:this

public void Close() { this.Dispose(); }

 

出处:http://blog.csdn.net/u013698770/article/details/53521180spa

===================================================================================.net

另外还有一种方式:调试

子窗体定义一个委托,父窗体实例化子窗体时注册子窗体的委托事件(具体功能是实现父窗口的控件变化),子窗体关闭时调用事件方法。
   
父窗体
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();
}
}

出处:https://zhidao.baidu.com/question/134623114688436765.htmlcode

========================================================================

根据上面的说明,咱们本身实现本身的功能,个人功能其实很简单,就一行代码,释放资源,

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; };中使用的参数,不要和按钮事件中参数名相同,注意参数冲突。

相关文章
相关标签/搜索