You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForms使用Delegate实现窗体间借款人数据共享问题求助

解决WinForms两个窗体DataGridView数据同步问题

方案1:使用共享绑定数据源(最稳妥)

  • 不要在add1中维护独立的借款人列表,将数据源抽为全局共享的BindingList<T>(自带数据变更通知,修改后自动同步控件)
  • 示例代码:
    在Program.cs中定义共享数据源:
    public static BindingList<Emprunteur> SharedEmprunteurs = new BindingList<Emprunteur>();
    
    两个窗体加载时绑定到该集合:
    // 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;
    }
    
    后续在add1中添加/修改借款人时,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:06:27