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
相关产品推荐
相关产品推荐

