如何在DataGridView中合并相似值行并汇总数量与总额
解决DataGridView同名行合并及数量/总额累加问题
嗨,这个需求我之前做库存类应用的时候刚好碰到过,给你整理几个实用的思路和代码示例,应该能帮到你~
核心逻辑思路
- 每次要添加商品时,先遍历DataGridView已有的行,检查是否存在商品名称完全相同的行
- 如果找到同名行:取出该行当前的数量和总额,和新数据累加后更新该行的对应单元格
- 如果没找到:直接新增一行数据
代码示例(以C# WinForms为例)
假设你的DataGridView列分别是商品名称、数量、总额,可以封装一个方法来处理这个合并逻辑:
private void AddOrMergeProduct(string productName, int quantity, decimal totalAmount) { // 遍历现有行,跳过默认的空白新行 foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.IsNewRow) continue; string existingProduct = row.Cells["商品名称"].Value.ToString(); // 忽略大小写匹配,也可以改成严格匹配去掉StringComparison参数 if (existingProduct.Equals(productName, StringComparison.OrdinalIgnoreCase)) { // 累加数量 int currentQty = Convert.ToInt32(row.Cells["数量"].Value); row.Cells["数量"].Value = currentQty + quantity; // 累加总额 decimal currentTotal = Convert.ToDecimal(row.Cells["总额"].Value); row.Cells["总额"].Value = currentTotal + totalAmount; return; // 完成更新后直接退出方法 } } // 没有找到同名商品,新增一行 dataGridView1.Rows.Add(productName, quantity, totalAmount); }
绑定数据源场景的处理
如果你的DataGridView是绑定DataTable这类数据源的,直接操作数据源会更稳妥,DataGridView会自动同步显示:
// 假设数据源是预先绑定好的DataTable dt private void AddOrMergeProductToDataTable(string productName, int quantity, decimal totalAmount) { // LINQ查找同名行 DataRow targetRow = dt.AsEnumerable() .FirstOrDefault(r => r.Field<string>("商品名称").Equals(productName, StringComparison.OrdinalIgnoreCase)); if (targetRow != null) { // 累加更新 targetRow["数量"] = targetRow.Field<int>("数量") + quantity; targetRow["总额"] = targetRow.Field<decimal>("总额") + totalAmount; } else { // 新增行到数据源 dt.Rows.Add(productName, quantity, totalAmount); } }
小提示
- 可以给数量和总额的转换加个
try-catch,避免输入非数字导致报错 - 如果是通过选择控件(比如下拉框、列表)触发添加操作,直接在选择事件里调用上面的方法就行
内容的提问来源于stack exchange,提问作者Jefferson Yosores Alcanar
相关产品推荐
相关产品推荐

