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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:01:25