許多新手嘗試在 FormA 中 `new FormB()` 後直接設定 `formB.sqlStr = "SELECT ..."`,卻發現 FormB 顯示時資料為空。原因通常是:
// 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();
var frm = new FormB();
frm.SqlCommand = "SELECT * FROM Users"; // 公用屬性
frm.Show();
// FormA
var frm = new FormB();
frm.DataRequested += (sender, e) => e.Sql = "SELECT ...";
frm.Show();
若多視窗共享複雜狀態,建議建立獨立的 ViewModel 或 DataContext 類別,透過依賴注入(DI 容器)共享同一實例,實現 MVVM 風格解耦。
跨表單傳值的核心原則:明確擁有權、在正確時機注入、避免全域狀態。建構子注入是最安全的預設選擇。