C#中關閉子視窗而不釋放子視窗物件的方法

38度6發表於2018-08-28

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();

        }

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

———————————————————————————————————-

另外還有一種方式:

子窗體定義一個委託,父窗體例項化子窗體時註冊子窗體的委託事件(具體功能是實現父視窗的控制元件變化),子窗體關閉時呼叫事件方法。

父窗體
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.html

——————————————————————————————————————

根據上面的說明,我們自己實現自己的功能,我的功能其實很簡單,就一行程式碼,釋放資源,

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; };中使用的引數,不要和按鈕事件中引數名相同,注意引數衝突。

出處:http://www.cnblogs.com/mq0036/p/6492960.html

相關文章