如何将DataGridView某列所有值合并插入另一DataGridView指定单元格?
解决方案
你的问题出在循环中每次覆盖参数值,最终只会保留最后一条记录的值。要实现列值合并,需要先把所有目标值拼接成单个字符串,再传入参数。
步骤1:拼接合并字符串
使用StringBuilder高效拼接所有benefit和BenefitAmount的值(推荐用逗号或分号作为分隔符,方便后续解析):
// 初始化字符串构建器,用于拼接benefit和BenefitAmount StringBuilder benefitBuilder = new StringBuilder(); StringBuilder benefitAmountBuilder = new StringBuilder(); // 遍历tbladdbenefit的有效行(排除最后一行新增空行) for (int i = 0; i < tbladdbenefit.Rows.Count - 1; i++) { var benefitValue = tbladdbenefit.Rows[i].Cells[1].Value?.ToString(); var amountValue = tbladdbenefit.Rows[i].Cells[2].Value?.ToString(); if (!string.IsNullOrEmpty(benefitValue)) { if (benefitBuilder.Length > 0) benefitBuilder.Append(", "); // 添加分隔符 benefitBuilder.Append(benefitValue); } if (!string.IsNullOrEmpty(amountValue)) { if (benefitAmountBuilder.Length > 0) benefitAmountBuilder.Append(", "); benefitAmountBuilder.Append(amountValue); } } // 转换为最终字符串,空的话设为默认值 string mergedBenefit = benefitBuilder.Length > 0 ? benefitBuilder.ToString() : ""; string mergedBenefitAmount = benefitAmountBuilder.Length > 0 ? benefitAmountBuilder.ToString() : "";
步骤2:修正参数赋值与SQL命令
修正AddWithValue的错误用法(第二个参数是值而非SqlDbType),直接传入拼接好的合并字符串:
cmd = new SqlCommand(@"INSERT INTO payrolltable (Name, Position, Honoraria, Total, Benefit, BenefitAmount, Deduction, DeductionAmount) VALUES (@name, @position, @honoraria, @total, @benefit, @benefitamount, @deduction, @deductionamount)", con); // 基础参数赋值 cmd.Parameters.AddWithValue("@name", txtfname.Text + " " + txtlname.Text); cmd.Parameters.AddWithValue("@position", txtposition.Text); cmd.Parameters.AddWithValue("@honoraria", txtsalary.Text); cmd.Parameters.AddWithValue("@total", 323232); cmd.Parameters.AddWithValue("@deduction", " "); cmd.Parameters.AddWithValue("@deductionamount", " "); // 传入合并后的字符串 cmd.Parameters.AddWithValue("@benefit", mergedBenefit); cmd.Parameters.AddWithValue("@benefitamount", mergedBenefitAmount); // 执行命令 cmd.ExecuteNonQuery();
关键说明
- 用
StringBuilder代替直接字符串拼接,避免频繁创建字符串对象,提升性能。 - 加入空值判断,防止空单元格导致拼接出无效分隔符(比如开头或结尾的逗号)。
- 原代码中
AddWithValue("@benefit", SqlDbType.VarChar)是错误用法,AddWithValue的第二个参数是参数值;若要显式指定类型,可改用cmd.Parameters.Add("@benefit", SqlDbType.VarChar).Value = mergedBenefit;,直接传入字符串也能正常工作。
内容的提问来源于stack exchange,提问作者echooooslam
相关产品推荐
相关产品推荐

