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

C#如何向DataGridView新增数据且不覆盖原有已绑定数据

问题原因
  • 循环中反复给DataSource赋值会直接覆盖上一次绑定的数据源,所以最终只会显示最后一次查询返回的listBox最后一项对应数据。
  • 当DataGridView设置了DataSource处于数据绑定状态时,控件本身不允许直接调用Rows.Add()方法手动插入行,所以会抛出你遇到的异常。
实现方案

方案1:合并所有数据后统一绑定(推荐)

不要在循环内重复赋值DataSource,先把所有待加载的数据汇总到同一个可绑定集合,最后一次性绑定到控件即可。
如果cls_all.Get_Test3()返回值为DataTable类型,代码如下:

DataTable totalData = new DataTable();
// 遍历listBox取所有查询结果
for (int i = 0; i < listBox1.Items.Count; i++)
{
    float param = Convert.ToSingle(listBox1.Items[i].ToString());
    DataTable temp = cls_all.Get_Test3(param);
    totalData.Merge(temp);
}
// 若DataGridView已有旧数据需要保留,先合并旧数据再绑定
if (dataGridView1.DataSource is DataTable oldData)
{
    totalData.Merge(oldData);
}
dataGridView1.DataSource = totalData;

如果cls_all.Get_Test3()返回值为强类型实体集合,代码如下:

// 将YourEntity替换为你自己的业务实体类型
List<YourEntity> totalData = new List<YourEntity>();
for (int i = 0; i < listBox1.Items.Count; i++)
{
    float param = Convert.ToSingle(listBox1.Items[i].ToString());
    var temp = cls_all.Get_Test3(param);
    totalData.AddRange(temp);
}
// 合并已有旧数据
if (dataGridView1.DataSource is List<YourEntity> oldList)
{
    totalData.InsertRange(0, oldList);
}
// 先置空再绑定可避免部分渲染异常
dataGridView1.DataSource = null;
dataGridView1.DataSource = totalData;

方案2:解除绑定后手动添加行

如果不想使用数据绑定模式,可以先清空DataSource解除绑定状态,之后就可以正常调用Rows.Add()方法插入行:

// 解除数据绑定
dataGridView1.DataSource = null;
// 请提前手动配置好DataGridView的列,与返回数据的字段顺序、数量对应
for (int i = 0; i < listBox1.Items.Count; i++)
{
    float param = Convert.ToSingle(listBox1.Items[i].ToString());
    var temp = cls_all.Get_Test3(param);
    // 假设返回的是DataTable,逐行添加
    foreach (DataRow row in temp.Rows)
    {
        dataGridView1.Rows.Add(row.ItemArray);
    }
}

提示:非绑定模式仅适合数据量较小的场景,数据量较大时数据绑定模式的排序、渲染性能远高于手动加行模式。

内容的提问来源于stack exchange,提问作者ibrahem rmadan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:24:18