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
相关产品推荐
相关产品推荐

