直接將控件 Modifiers = Public,在另一窗體 form1.dataGridView1.Rows.Add(...) —— 破壞封裝、難維護、線程不安全。
// 窗體 A (擁有 DataGridView)
public partial class MainForm : Form {
public void AppendRow(string col1, string col2) {
if (dataGridView1.InvokeRequired) {
dataGridView1.BeginInvoke((Action)(() => AppendRow(col1, col2)));
return;
}
dataGridView1.Rows.Add(col1, col2);
}
}
// 窗體 B (調用方)
public partial class ChildForm : Form {
private MainForm _mainForm;
public ChildForm(MainForm mainForm) {
_mainForm = mainForm;
InitializeComponent();
}
private void btnAdd_Click(object sender, EventArgs e) {
_mainForm.AppendRow("新數據1", "新數據2");
}
}
// 窗體 B 定義事件
public event Action RowAdded;
// 窗體 A 訂閱
var child = new ChildForm();
child.RowAdded += (c1, c2) => AppendRow(c1, c2);
child.Show();
Control.Invoke/BeginInvoke 或 SynchronizationContext.Post。BeginInvoke 非阻塞,適合高頻更新;Invoke 阻塞,適合需等待結果場景。Modifiers 永遠保持 Private。AppendOrder)而非控件操作方法(AddRow)。event/delegate 實現雙向解耦,窗體 B 無需引用窗體 A 類型。