首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

WinForms 窗體間數據傳遞:靜態類、構造函數注入與事件三種模式詳解

     編輯:程式設計綜合問答

場景

主窗體查詢數據庫,將結果傳遞給子窗體的 DataGridView 顯示。

模式一:靜態數據容器(最簡單,耦合度高)

// CommonData.cs
public static class CommonData {
    public static DataTable QueryResult { get; set; }
}

// 主窗體
CommonData.QueryResult = dt; // 查詢後賦值
var child = new ChildForm();
child.Show();

// 子窗體 Load 事件
dataGridView1.DataSource = CommonData.QueryResult;

缺點:全局狀態,多實例並發時數據競爭,單元測試困難。

模式二:構造函數/屬性注入(推薦,顯式依賴)

// 子窗體
public partial class ChildForm : Form {
    public DataTable DataSource { get; set; }
    public ChildForm() { InitializeComponent(); }
    private void ChildForm_Load(object sender, EventArgs e) {
        if (DataSource != null) dataGridView1.DataSource = DataSource;
    }
}

// 主窗體
var child = new ChildForm { DataSource = dt };
child.Show();

優點:依賴顯式、易測試、支持多實例隔離。

模式三:事件/回調(解耦,適合雙向通信)

// 主窗體定義事件
public event Action<DataTable> OnDataReady;

// 子窗體訂閱
mainForm.OnDataReady += dt => {
    if (InvokeRequired) Invoke(new Action(() => dataGridView1.DataSource = dt));
    else dataGridView1.DataSource = dt;
};

// 主窗體查詢完成後觸發
OnDataReady?.Invoke(dt);

適用於異步查詢、多窗體同步更新場景。

選型指南

  • 簡單單向傳遞 → 構造函數/屬性注入。
  • 臨時原型/單實例 → 靜態容器(技術債務,事後重構)。
  • 異步/多訂閱者/雙向交互 → 事件/委託/消息總線。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved