C#中DataGridView用foreach循环加载数据重复问题及修复
嘿,我来拆解下你遇到的这个DataGridView重复加载数据的问题,以及为什么调整后的代码能搞定它:
问题场景
我通过foreach循环从数据库加载数据到DataGridView里,但第二次打开这个DataGridView时,界面会同时显示之前的旧数据和新加载的数据,出现了数据重复的问题。
最初尝试的修复代码(存在逻辑问题)
private void ViewAvailProd_Btn_Click(object sender, EventArgs e) { int numRows = AvailProd_DGV.RowCount; foreach (TBL_Product prod in DataLProducts.GetProducts()) { if (numRows > 1) { AvailProd_DGV.Rows.Clear(); } AvailProd_DGV.Rows.Add(prod.ProductID, prod.Name, prod.Category, prod.Price, prod.Stock, "Purchase"); } this.PNL_ViewAvailProd.Visible = true; }
为什么这段代码不管用?
这里的核心问题出在清空操作的位置和判断逻辑:
- 你在进入
foreach循环前就获取了numRows的值,之后即使执行Rows.Clear()改变了实际行数,numRows的数值也不会更新 - 更糟的是,清空操作被放在了循环内部,这意味着如果初始行数大于1,每一次循环迭代都会执行一次清空——你刚添加一行数据,下一次循环就会把它清空,最后可能只显示最后一条数据,或者出现其他异常
- 而且这个逻辑完全没必要嵌套在循环里,清空旧数据只需要在加载新数据前做一次就够了
修复后的正确代码
private void ViewAvailProd_Btn_Click(object sender, EventArgs e) { AvailProd_DGV.Rows.Clear(); foreach (TBL_Product prod in DataLProducts.GetProducts()) { AvailProd_DGV.Rows.Add(prod.ProductID, prod.Name, prod.Category, prod.Price, prod.Stock, "Purchase"); } this.PNL_ViewAvailProd.Visible = true; }
修复逻辑说明
把Rows.Clear()移到foreach循环外面后,流程就变得清晰且可靠:
- 点击按钮后,先一次性清空
DataGridView里所有旧数据,彻底避免残留问题 - 再通过
foreach循环逐个从数据库读取数据并添加到表格中 - 最后显示对应的面板,确保每次打开都是全新的完整数据集
内容的提问来源于stack exchange,提问作者user7943




