Array.Copy()不适用于C#中的DataRow

时间:2014-05-08 16:11:54

标签: c# arrays

我有两个数组,我需要使用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);
}

2 个答案:

答案 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将为您创建一个新对象。