1

有一个数据表(source),并且创建了这个数据表的一个副本(copy),并且在这个副本中,DataGridView中的一些行被修改了。

修改结束后,一个方法是用复制数据表中的修改行更新源数据表。

DataTable source ;// it is population by database.

及其副本

DataTable copy = source.Copy(); // Here is the copy datatble.

方法是这样的:

public static void UpdateData(DataTable source, DataTable copy)
{
    foreach (DataRow row in copy.Rows)
    {
        if (row.RowState == DataRowState.Modified)
        {
            var relRow = source.Select("Id = '" + row["Id"] + "'");
            if (relRow.Any())
            {
                //relRow[0] = row; //This statement is not udating row in the source dataTable.
                foreach (var column in copy.Columns)
                {
                    relRow[0][column.ColumnName] = row[column.ColumnName];
                }
            }
        } 
        else if (row.RowState == DataRowState.Added)
        {
               //Performing some operations to for checking additional values. modiging 'row' with some relative data, and adding to source.
                source.Rows.Add(row.ItemArray);
        }       
    }

    return source;
}

当将行对象分配给 datarows 数组的第一个元素 relRow[0] = row时,它不会更新源数据表,而是在 relRow[0] 中调试时显示修改后的数据。

逐列分配反映数据表中的更改。

所以,问题是:为什么relRow[0] = row不在源数据表中更新?

谢谢。

4

1 回答 1

1

通过编写relRow[0] = row;,您只需重新分配 relRow 的引用,修改本地数组的第 0 个元素。它实际上并没有改变表中行的内容。您的代码与以下内容相同:

DataRow[] localRows;
// here, localRows will reference items in the source table. 
// Below, you overwrite the reference.
localRows = source.Select("Id = '" + row["Id"] + "'");
if(localRows.Any())
{
    //changes what reference the 0th element of the localRows array points to,
    // doesn't change anything about the datatable.
    // localRows[0] now points to the local variable row (i.e. the item from copy)
    localRows[0] = row; 
}

要修改表格,您可以替换relRow[0] = row;为修改relRow元素而不是其引用的内容:

for(var col = 0; col < source.Columns.Count; i++)
{
    relRow[0][col] = row[col];
}
于 2012-08-24T13:11:03.943 回答