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

C# WinForms 視窗間傳遞字串:正確的跨表單資料流向

     編輯:程式設計疑難解答

常見錯誤:直接存取另一個表單的 public 欄位

許多新手嘗試在 FormA 中 `new FormB()` 後直接設定 `formB.sqlStr = "SELECT ..."`,卻發現 FormB 顯示時資料為空。原因通常是:

  • 建立了新的 FormB 實例,但顯示的是另一個實例(如 `Application.Run(new FormB())`)。
  • FormB 尚未載入控制項就讀取欄位,導致繫結失敗。
  • 跨執行緒存取 UI 導致例外。

推薦模式:建構子注入 / 屬性注入 / 事件回呼

1. 建構子注入(最簡單、強型別)

// FormB
public partial class FormB : Form {
    public FormB(string sql) : this() { // 呼叫無參建構子完成 InitializeComponent
        this.sqlStr = sql;
        LoadData();
    }
    private string sqlStr;
    private void LoadData() { /* 使用 sqlStr 查詢並繫結 */ }
}

// FormA
var frm = new FormB("SELECT * FROM Users");
frm.ShowDialog();

2. 屬性注入(適用於非強制參數)

var frm = new FormB();
frm.SqlCommand = "SELECT * FROM Users"; // 公用屬性
frm.Show();

3. 事件/委派回呼(雙向通訊)

// FormA
var frm = new FormB();
frm.DataRequested += (sender, e) => e.Sql = "SELECT ...";
frm.Show();

進階:共用資料模型

若多視窗共享複雜狀態,建議建立獨立的 ViewModel 或 DataContext 類別,透過依賴注入(DI 容器)共享同一實例,實現 MVVM 風格解耦。

總結

跨表單傳值的核心原則:明確擁有權、在正確時機注入、避免全域狀態。建構子注入是最安全的預設選擇。

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