我有两个数组,我需要使用Array.Copy将第二个前置项放到另一个数组中,但没有任何反应,它只是不添加任何内容。
以下是代码:
DataRow[] auxRows = rFComDataSet.TestStepNames
.Select("ScenarioName = '" + scenarioName + "'");
DataRow[] newRows = new DataRow[auxRows.Count()];
auxRows.CopyTo(newRows, 0);
foreach (DataRow row in newRows)
{
DataRow teste = this.rFComDataSet.TestStepNames.NewRow();
Array.Copy(row.ItemArray, 1, teste.ItemArray, 0, 4);
row["ScenarioName"] = newScenarioName;
this.rFComDataSet.TestStepNames.Rows.Add(row.ItemArray);
}
答案 0 :(得分:3)
此行为是ItemArray属性实现的结果 这是GET访问者的代码
public object[] ItemArray
{
get
{
int num;
object[] objArray;
DataColumn column;
int num2;
num2 = this.GetDefaultRecord();
objArray = new object[this._columns.Count];
num = 0;
goto Label_0037;
Label_001C:
column = this._columns[num];
objArray[num] = column[num2];
num += 1;
Label_0037:
if (num < ((int) objArray.Length))
{
goto Label_001C;
}
return objArray;
}
}
正如您所看到的,调用DataRow.ItemArray会返回一个新的对象数组,其中来自underlyng行的值被复制到。
当您使用Array.Copy
时,您将在此数组中设置值而不是
DataRow的基础值。所以你的行仍然是空值
可能的解决方法是以下(未测试)
object[] itemArray = new object[this.rFComDataSet.TestStepNames.Columns.Count];
Array.Copy(row.ItemArray, 1, itemArray, 0, 4);
this.rFComDataSet.TestStepNames.Rows.Add(itemArray);
通过这种方式,我们强制Rows.Add创建的新行的基础值是单独创建的对象数组的值
但有几点需要注意。您的调用auxRows.CopyTo(newRows, 0);
没有创建新行,它只是复制引用到新数组的所有行,但它们指向相同的数据,因此更改newRows中的任何内容都会更改auxRows中的相应行。
最后不清楚为什么你要完成所有这些工作来复制行,然后将来自foreach循环的同一行添加到TestStepNames表中
答案 1 :(得分:0)
只需跳过复制并执行以下操作:
DataRow teste = this.rFComDataSet.TestStepNames.NewRow();
teste.ItemArray = row.ItemArray;
row.ItemArray
将为您创建一个新对象。