在 WinForms 應用中,父視窗與子視窗(或同層視窗)之間交換資料是常見需求。本文整理三種主流做法,分析其適用情境與優缺點。
public Frm_Child(string para1, ArrayList list1, TextBox txtBox, Frm_Main mainForm)
{
InitializeComponent();
// 保存參考供後續使用
}
| 參數類型 | 傳遞行為 | 說明 |
|---|---|---|
| 字串/值型別 | 單向值傳遞 | 子視窗修改不影響父視窗 |
| 陣列/集合/類別 | 參考傳遞 | 雙向同步,修改內容雙方可見 |
| 控制項 | 參考傳遞 | 直接操作父視窗 UI 元素 |
| 父視窗本體 | 參考傳遞 | 可存取父視窗所有 public 成員,耦合度最高 |
優點:直觀、型別安全。
缺點:建構函數參數過多時難維護;傳遞父視窗會造成強耦合,違反單一職責原則。
// 方式一
Frm_Child child = new Frm_Child();
child.Owner = this;
child.ShowDialog();
// 方式二
child.ShowDialog(this); // 內部自動設定 Owner
子視窗中透過 this.Owner 取得父視窗參考:
Frm_Main parent = (Frm_Main)this.Owner;
this.listData1 = parent.ListData2;
優點:語意清晰(擁有關係),父視窗關閉/最小化時子視窗自動跟隨。
缺點:需轉型存取父視窗特定成員,仍有耦合;不適用於非 Modal 視窗的長期資料同步。
步驟:
public delegate void SendFun(string str); public event SendFun SendToParent;SendToParent?.Invoke(this.textBox1.Text);child.SendToParent += RecvInfo;void RecvInfo(string str) { textBox1.Text = str; }優點:雙向解耦,子視窗不知父視窗細節,符合觀察者模式。
缺點:程式碼較繁瑣;需注意事件取消訂閱避免記憶體洩漏。
Owner 模式最便利。理解三種模式的本質差異(強耦合 vs 鬆耦合、單向 vs 雙向),依據專案架構與維護性需求選擇,才能寫出乾淨可擴充的 WinForms 程式。