无需新增按钮实现DataGridView重复行移除
解决DataGridView无需按钮移除重复行的C#方案
当然可以实现!不用额外添加按钮,我们可以在填充DataGridView的过程中直接处理重复行,给你两种实用的C#代码方案,都不需要依赖SQL语句去重:
方案1:先对数据源去重,再填充DataGridView
这种方式效率更高,适合数据量较大的场景,先通过LINQ对原始DataTable进行去重处理,再将去重后的数据集填充到DataGridView中:
// 假设d是你从SQL Server获取的原始DataTable // 按要显示的两列组合分组,取每组第一行实现去重 var distinctRows = d.AsEnumerable() .GroupBy(row => new { CombinedCol = row["c1"].ToString() + " " + row["c2"].ToString(), Col3 = row["c3"].ToString() }) .Select(group => group.First()) .CopyToDataTable(); // 清空DataGridView原有行,再填充去重后的数据 dgw.Rows.Clear(); foreach (DataRow r in distinctRows.Rows) { dgw.Rows.Add(r["c1"].ToString() + " " + r["c2"].ToString(), r["c3"]); }
说明
- 这里的去重逻辑是两列值完全相同才算重复,如果你的重复判断只需要基于第一列(c1+c2的组合),只需要修改
GroupBy的键为CombinedCol即可。 - 用
GroupBy+Select(group => group.First())的方式,会保留每组重复数据中的第一行。
方案2:填充时实时检查重复行
如果不想提前处理整个DataTable,可以在遍历添加行的过程中,实时检查当前DataGridView是否已经存在相同的行,避免重复添加:
dgw.Rows.Clear(); // 先清空DataGridView的原有内容 foreach (DataRow r in d.Rows) { string targetCol1 = r["c1"].ToString() + " " + r["c2"].ToString(); string targetCol3 = r["c3"].ToString(); bool isDuplicate = false; // 遍历已有的DataGridView行,检查是否重复 foreach (DataGridViewRow existingRow in dgw.Rows) { // 跳过DataGridView的默认新行(如果开启了允许添加新行的话) if (!existingRow.IsNewRow) { if (existingRow.Cells[0].Value.ToString() == targetCol1 && existingRow.Cells[1].Value.ToString() == targetCol3) { isDuplicate = true; break; } } } // 非重复行才添加到DataGridView中 if (!isDuplicate) { dgw.Rows.Add(targetCol1, targetCol3); } }
说明
- 如果你的DataGridView没有开启允许用户添加新行的功能,可以去掉
!existingRow.IsNewRow的判断条件。 - 这种方式适合数据量较小的场景,避免提前遍历整个数据集。
内容的提问来源于stack exchange,提问作者heymycoder
相关产品推荐
相关产品推荐

