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