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

如何将一个DataRow的值赋值给另一个DataRow?解决只读属性报错

如何正确实现DataRow的值赋值操作?

嗨,这个问题我之前也踩过坑!你碰到的错误提示说得很明白:DataRowCollection的索引器是只读的,不能直接把一个DataRow对象“塞”到另一个DataTable的行集合里——毕竟每个DataRow都绑定了它所属的原DataTable,不能直接挪位置,得通过复制数据的方式来实现。

下面给你几种不同场景下的正确做法:

场景一:两个DataTable结构完全一致

如果dt和dt1的列名、数据类型、列顺序都完全匹配,有两种简单的方式:

方式1:用ItemArray批量赋值

直接把源行的所有值批量赋值给目标行,代码很简洁:

DataTable dt = GetTable(); 
DataTable dt1 = GetTable1(); 
// 批量替换目标行的所有值
dt.Rows[0].ItemArray = dt1.Rows[0].ItemArray;

注意:这个方法要求两个表的列顺序和类型完全对应,不然可能会出现值错位或者类型不匹配的错误。

方式2:导入整行(适合需要新增行的情况)

如果你是想把dt1的第一行加到dt里(替换原来的第一行的话,可以先移除原行):

DataTable dt = GetTable(); 
DataTable dt1 = GetTable1(); 

// 先移除dt原来的第一行(如果需要替换的话)
dt.Rows.RemoveAt(0);
// 导入dt1的第一行到dt,会自动复制所有数据和行状态
dt.ImportRow(dt1.Rows[0]);
// 要是想把导入的行放在第一位置,用InsertAt
// dt.Rows.InsertAt(dt1.Rows[0], 0);

场景二:两个DataTable结构不一致,或只需复制部分列

这种情况就得精准控制要复制的列,逐个赋值更靠谱:

DataTable dt = GetTable(); 
DataTable dt1 = GetTable1(); 

DataRow sourceRow = dt1.Rows[0];
DataRow targetRow = dt.Rows[0];

// 遍历源行的所有列,只复制目标表存在的列
foreach (DataColumn col in sourceRow.Table.Columns)
{
    if (targetRow.Table.Columns.Contains(col.ColumnName))
    {
        targetRow[col.ColumnName] = sourceRow[col.ColumnName];
    }
}

// 要是你只需要复制特定几列,直接指定列名更高效
// targetRow["UserName"] = sourceRow["UserName"];
// targetRow["Age"] = sourceRow["Age"];

总结一下,你原来的代码错误是因为试图直接替换DataRow对象,但Rows索引器只能读不能写,必须通过复制行内的数据来实现赋值~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:00:04