首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

WinForms 表單間資料傳遞的三種經典模式

     編輯:關於C#

前言

在 WinForms 應用中,父視窗與子視窗(或同層視窗)之間交換資料是常見需求。本文整理三種主流做法,分析其適用情境與優缺點。

模式一:修改子視窗建構函數傳遞參考

public Frm_Child(string para1, ArrayList list1, TextBox txtBox, Frm_Main mainForm)
{
    InitializeComponent();
    // 保存參考供後續使用
}
參數類型傳遞行為說明
字串/值型別單向值傳遞子視窗修改不影響父視窗
陣列/集合/類別參考傳遞雙向同步,修改內容雙方可見
控制項參考傳遞直接操作父視窗 UI 元素
父視窗本體參考傳遞可存取父視窗所有 public 成員,耦合度最高

優點:直觀、型別安全。
缺點:建構函數參數過多時難維護;傳遞父視窗會造成強耦合,違反單一職責原則。

模式二:利用 Owner 屬性建立擁有關係

// 方式一
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 視窗的長期資料同步。

模式三:事件/委託模式(鬆耦合)

步驟:

  1. 子視窗定義委託與事件:public delegate void SendFun(string str); public event SendFun SendToParent;
  2. 子視窗觸發事件:SendToParent?.Invoke(this.textBox1.Text);
  3. 父視窗訂閱事件:child.SendToParent += RecvInfo;
  4. 父視窗處理方法:void RecvInfo(string str) { textBox1.Text = str; }

優點:雙向解耦,子視窗不知父視窗細節,符合觀察者模式。
缺點:程式碼較繁瑣;需注意事件取消訂閱避免記憶體洩漏。

選型建議

  • 簡單單向傳值:建構函數或屬性注入。
  • Modal 對話框、短生命週期:Owner 模式最便利。
  • 複雜雙向互動、多視窗協作、長生命週期:事件/委託或引入 Mediator/EventAggregator 模式。

結語

理解三種模式的本質差異(強耦合 vs 鬆耦合、單向 vs 雙向),依據專案架構與維護性需求選擇,才能寫出乾淨可擴充的 WinForms 程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved