C# DataGridView按用户分组统计指定列求和方法咨询
在C# DataGridView中按用户分组求和的解决方案
嘿,我来帮你搞定这个分组求和的问题!你已经实现了整体求和,现在只需要在遍历的时候按用户分组统计就行,这里给你两种常用的方法:
方法一:使用LINQ(简洁高效)
LINQ可以让你用更简洁的代码完成分组和求和,非常适合这种场景:
// 先筛选出DataGridView中的有效行(排除最后一行的空白新行) var validRows = dataGridView2.Rows.Cast<DataGridViewRow>() .Where(row => !row.IsNewRow); // 按User列分组,并计算每组的Value总和 var groupedResults = validRows.GroupBy(row => row.Cells["User"].Value.ToString()) .Select(group => new { UserName = group.Key, TotalSum = group.Sum(row => Convert.ToInt32(row.Cells["Value"].Value)) }); // 遍历输出结果(也可以绑定到其他控件展示) foreach (var result in groupedResults) { Console.WriteLine($"{result.UserName}: {result.TotalSum}"); // 如果要显示在界面上,比如添加到ListBox: // listBox1.Items.Add($"{result.UserName}: {result.TotalSum}"); }
代码说明:
Cast<DataGridViewRow>():把DataGridView的行集合转换成LINQ可操作的IEnumerable<DataGridViewRow>Where(row => !row.IsNewRow):排除DataGridView默认的最后一行空白新行,避免空值错误GroupBy(...):按User列的值进行分组Sum(...):对每组内的Value列值求和
方法二:传统循环+Dictionary(直观易懂)
如果你对LINQ不太熟悉,用Dictionary来存储每个用户的总和也是个好办法,改造你现有的循环即可:
// 用Dictionary存储用户名和对应的总和:键=用户名,值=总和 Dictionary<string, int> userTotalDict = new Dictionary<string, int>(); // 遍历所有有效行(排除新行) for (int i = 0; i < dataGridView2.Rows.Count - 1; i++) { DataGridViewRow currentRow = dataGridView2.Rows[i]; // 处理可能的空值,避免转换出错 if (currentRow.Cells["User"].Value == null || currentRow.Cells["Value"].Value == null) continue; string userName = currentRow.Cells["User"].Value.ToString(); int valueToSum = Convert.ToInt32(currentRow.Cells["Value"].Value); // 判断字典中是否已有该用户,有则累加,无则添加 if (userTotalDict.ContainsKey(userName)) { userTotalDict[userName] += valueToSum; } else { userTotalDict.Add(userName, valueToSum); } } // 输出结果 foreach (var kvp in userTotalDict) { Console.WriteLine($"{kvp.Key}: {kvp.Value}"); }
代码说明:
Dictionary<string, int>:专门用来存储每个用户的累计总和,键是唯一的用户名,值是对应总和- 空值判断:避免单元格为空时
Convert.ToInt32抛出异常 - 循环中更新字典:每次遍历行时,根据用户名更新对应的总和
注意事项
- 确保你的列名(
"User"和"Value")和DataGridView中的实际列名一致,或者用列索引(比如Cells[0]、Cells[1])代替 - 如果Value列可能有非整数的值,建议用
int.TryParse代替Convert.ToInt32,进一步避免异常:if (int.TryParse(currentRow.Cells["Value"].Value.ToString(), out int valueToSum)) { // 执行累加逻辑 }
两种方法都能实现你想要的分组求和效果,你可以根据自己的代码习惯选择~
内容的提问来源于stack exchange,提问作者Shepniel Sh
相关产品推荐
相关产品推荐

