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

C# 实现DataTable复制现有行并在原行下方插入指定次数的问题

DataTable按xMulti字段值批量复制行的实现方案

原有代码的核心问题

  • 直接遍历DataTable.Rows集合的同时插入新行,会改变集合的结构,不仅会触发遍历异常,还会导致程序重复处理刚插入的新行,最终行数超出预期
  • DataRow temp = (DataRow)row[index];逻辑完全错误:row是单条数据行对象,使用索引器访问时获取的是对应列的字段值,而非新的行对象,强行做DataRow类型转换会直接抛出异常
  • 插入次数计算错误:原行本身已经在表中存在,不需要再插入xMulti份,只需要插入xMulti-1份即可,最终总份数和xMulti值一致

正确实现代码

int xMultiPos = 0;
if (DtTbl.Columns.Contains("xMulti"))
{
    xMultiPos = DtTbl.Columns.IndexOf("xMulti");
    // 将原表的行转为数组后遍历,避免插入行时修改原集合导致的遍历异常
    DataRow[] originalRows = DtTbl.Rows.Cast<DataRow>().ToArray();
    
    foreach (DataRow row in originalRows)
    {
        // 安全转换xMulti值,避免空值、格式错误导致的异常
        if (!int.TryParse(row[xMultiPos]?.ToString(), out int xMultiplicatorTemp) 
            || xMultiplicatorTemp <= 1)
        {
            continue;
        }
        
        TB_Info.Text = "vorhanden";
        int originalRowIndex = DtTbl.Rows.IndexOf(row);
        // 插入xMulti-1份,原行保留1份,总份数等于xMulti值
        for (int i = 0; i < xMultiplicatorTemp - 1; i++)
        {
            DataRow tempRow = DtTbl.NewRow();
            // 直接复制原行所有字段的值,保证数据完全一致
            tempRow.ItemArray = row.ItemArray;
            // 依次插入到原行的下方,保证行顺序正确
            DtTbl.Rows.InsertAt(tempRow, originalRowIndex + 1 + i);
        }
    }
}

关键逻辑说明

  • 遍历转换后的原行数组,不会受后续插入操作的影响,保证每个原行只会被处理一次
  • 使用ItemArray批量复制原行的所有字段值,不需要手动逐列赋值,适配表结构变更的场景
  • 插入位置按originalRowIndex + 1 + i计算,保证新复制的行都按顺序排列在原行的下方

内容的提问来源于stack exchange,提问作者Remo Gwerder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 20:18:03