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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:45:21