C# WinForms使用Delegate实现窗体间借款人数据共享问题求助
解决WinForms两个窗体DataGridView数据同步问题
方案1:使用共享绑定数据源(最稳妥)
- 不要在add1中维护独立的借款人列表,将数据源抽为全局共享的
BindingList<T>(自带数据变更通知,修改后自动同步控件) - 示例代码:
在Program.cs中定义共享数据源:
两个窗体加载时绑定到该集合:public static BindingList<Emprunteur> SharedEmprunteurs = new BindingList<Emprunteur>();
后续在add1中添加/修改借款人时,// add1窗体加载事件 private void Add1_Load(object sender, EventArgs e) { dgvAddEmprunteur.DataSource = Program.SharedEmprunteurs; } // list1窗体加载事件 private void List1_Load(object sender, EventArgs e) { dgvListEmprunteur.DataSource = Program.SharedEmprunteurs; }BindingList会自动触发更新通知,list1的DataGridView无需额外操作即可同步。
方案2:修复委托事件实现
若之前委托未生效,大概率是事件绑定时机或实例引用错误:
- 在add1中定义委托与事件:
public delegate void EmprunteurUpdatedEventHandler(List<Emprunteur> updatedList); public event EmprunteurUpdatedEventHandler EmprunteurUpdated; - 借款人列表变更时(如点击添加按钮后)触发事件:
private void btnAdd_Click(object sender, EventArgs e) { // 完成添加借款人到本地列表的逻辑后 EmprunteurUpdated?.Invoke(yourLocalEmprunteurList); } - 打开list1时绑定事件(关键:使用当前add1实例而非新建):
// add1中打开list1的代码 private void btnOpenList_Click(object sender, EventArgs e) { List1 listForm = new List1(); this.EmprunteurUpdated += listForm.UpdateEmprunteurList; listForm.Show(); } - list1中实现事件处理方法:
public void UpdateEmprunteurList(List<Emprunteur> updatedList) { dgvListEmprunteur.DataSource = null; dgvListEmprunteur.DataSource = updatedList; }
方案3:修复静态GestionEmprunteur实例问题
若静态实例未生效,检查以下要点:
- 确保GestionEmprunteur的列表为静态成员,并提供操作方法:
public class GestionEmprunteur { private static BindingList<Emprunteur> _emprunteurs = new BindingList<Emprunteur>(); public static BindingList<Emprunteur> GetEmprunteurs() => _emprunteurs; public static void AddEmprunteur(Emprunteur emp) => _emprunteurs.Add(emp); } - add1中添加借款人时调用静态方法:
GestionEmprunteur.AddEmprunteur(newEmprunteur); - list1绑定到静态集合(因用
BindingList,变更后自动同步):private void List1_Load(object sender, EventArgs e) { dgvListEmprunteur.DataSource = GestionEmprunteur.GetEmprunteurs(); }
常见坑点排查
- 禁止在每个窗体中新建独立的列表实例,必须保证数据源引用一致
- 若使用
List<T>而非BindingList<T>,修改后需手动重置DataGridView的DataSource(先设为null再重新绑定) - 委托事件需订阅正确的事件源,不要在list1中新建add1实例,要引用打开它的那个add1实例
内容的提问来源于stack exchange,提问作者proxyy
相关产品推荐
相关产品推荐

