You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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循环外面后,流程就变得清晰且可靠:

  1. 点击按钮后,先一次性清空DataGridView里所有旧数据,彻底避免残留问题
  2. 再通过foreach循环逐个从数据库读取数据并添加到表格中
  3. 最后显示对应的面板,确保每次打开都是全新的完整数据集

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

火山引擎 最新活动