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

如何在列未知的情况下删除DataGridView中的重复行

现有代码问题
  • 索引越界问题:DataGridView行、列索引均从0开始,原代码循环条件写j <= rws1、l <= rws1、i <= cl,已经超出了最大索引范围;且删除行后实际行数会减少,提前固定存储的rws1不再匹配实际行数,会进一步触发越界。
  • 重复判断逻辑错误:原代码只要任意一列值相等就删除行,不符合「整行所有列值完全一致才是重复行」的需求;且两层行循环都从0开始,会出现行自己和自己比较的情况,直接误删正常行。
  • 遍历删除逻辑错误:正向遍历过程中删除行,后续行的索引会自动前移,会跳过下一行的判断,导致漏检重复项。
正确实现代码

采用倒序遍历+逐列全匹配逻辑,无需提前知晓列信息,自动适配所有列,同时兼容空值、允许用户添加行的场景:

// 倒序遍历行,避免删除行后索引偏移导致漏检
for (int i = dataGridView1.Rows.Count - 1; i >= 0; i--)
{
    // 跳过控件自带的空白待输入新行
    if (dataGridView1.Rows[i].IsNewRow) continue;
    
    // 仅和当前行前面的行对比,避免重复校验+自己和自己对比的问题
    for (int j = i - 1; j >= 0; j--)
    {
        if (dataGridView1.Rows[j].IsNewRow) continue;
        bool isDuplicate = true;
        
        // 逐列对比所有单元格的值
        for (int col = 0; col < dataGridView1.ColumnCount; col++)
        {
            // 统一处理null和DBNull空值情况,避免空引用报错
            var val1 = dataGridView1.Rows[i].Cells[col].Value ?? DBNull.Value;
            var val2 = dataGridView1.Rows[j].Cells[col].Value ?? DBNull.Value;
            if (!val1.Equals(val2))
            {
                isDuplicate = false;
                break;
            }
        }
        
        // 确认是重复行后删除当前行,直接跳出内层循环
        if (isDuplicate)
        {
            dataGridView1.Rows.RemoveAt(i);
            break;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:18:02