如何将一个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
相关产品推荐
相关产品推荐

