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

绑定List<Memo>后DataGridView不显示数据问题排查

问题:DataGridView添加数据后无法显示新增内容?

我有一个由用户输入生成的List,已绑定到数据源类,同时有一个DataGridView用于展示该数据。相关代码如下:

ViewMemo_Load方法:

private void ViewMemo_Load(object sender, EventArgs e) 
{ 
    dgvMemo.DataSource = Datasources.memorecorders; 
}

AddMemo类的btAdd_Click方法:

private void btAdd_Click(object sender, EventArgs e) 
{ 
    int SerialId; 
    SerialId = int.Parse(txtSerialId.Text); 
    decimal price; 
    price = decimal.Parse(txtPrijs.Text); 
    MemoRecorder m1 = new MemoRecorder(SerialId); 
    m1.make = txtMerk.Text; 
    m1.model = txtModel.Text; 
    m1.priceExBtw = price; 
    m1.creationDate = dtProductie.Value; 
    foreach (MemoCartridgeType mem in Enum.GetValues(typeof(MemoCartridgeType))) 
    { 
        if (cbCartridge.SelectedValue.ToString() == mem.ToString()) 
        { 
            m1.maxCartridgeType = mem; 
        } 
    } 
    Datasources.memorecorders.Add(m1); 
    MessageBox.Show("uitkomst: Merk: " + m1.make + "model: " + m1.model + " ,prijs Ex btw: "+ m1.priceExBtw + " ,CartridgeType: "+ m1.maxCartridgeType + " ,Creatie Datum: " + m1.creationDate); 
    txtMerk.Text = String.Empty; 
    txtModel.Text = String.Empty; 
    txtPrijs.Text = String.Empty; 
}

但添加数据后,DataGridView中并未显示新增数据,请问问题出在哪里?


解答

嘿,这个问题我碰到过好多次了!核心原因很简单:你用的List<MemoRecorder>没有自带数据变更通知机制,DataGridView根本不知道你往里面加了新数据,自然不会自动刷新界面。

给你两个解决办法,按需选择:

方法一:手动触发DataGridView刷新(快速临时方案)

在你添加完新的MemoRecorder之后,手动重置一下DataGridView的数据源,让它重新读取数据:

// 先清空数据源,再重新绑定
dgvMemo.DataSource = null;
dgvMemo.DataSource = Datasources.memorecorders;

不过这个方法有个小缺点:会重置DataGridView的列状态(比如用户调整过的列宽、排序会回到默认),适合简单场景临时用。

方法二:改用BindingList(推荐的优雅方案)

把Datasources里的memorecorders类型从List<MemoRecorder>改成BindingList<MemoRecorder>。BindingList<T>实现了IBindingList接口,当你添加、删除元素时,会自动通知绑定的DataGridView更新界面,完全不需要手动刷新。

步骤很简单:

  1. 修改数据源定义:
// 原来的List改成BindingList
public static BindingList<MemoRecorder> memorecorders = new BindingList<MemoRecorder>();
  1. 你的绑定代码dgvMemo.DataSource = Datasources.memorecorders;不需要改,之后每次调用Datasources.memorecorders.Add(m1);,DataGridView都会自动显示新增的记录,完美解决问题!

另外提个小建议:如果之后你需要修改已存在的MemoRecorder属性(比如改价格、型号),也想让DataGridView自动更新,那你需要让MemoRecorder类实现INotifyPropertyChanged接口,不过这是进阶需求,先解决当前的新增显示问题就够啦。


内容的提问来源于stack exchange,提问作者mika grijpma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:07:34