1

データテーブル(ソース)があり、このデータテーブルのコピーが作成され(コピー)、このコピーでは、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の参照relRow[0] = row;を再割り当てし、ローカル配列の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の要素relRow[0] = row;を変更するものに置き換えることができます。

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