0

このテストコードは本当に簡単です

var addedRows1 = (securityDataTable.GetChanges(DataRowState.Added));
MessageBox.Show(addedRows1.Rows[1].RowState.ToString());
MessageBox.Show(addedRows1.Rows.Count.ToString());

addedRows1.Rows[1].AcceptChanges();

var addedRows2 = (securityDataTable.GetChanges(DataRowState.Added));
MessageBox.Show(addedRows2.Rows[1].RowState.ToString());
MessageBox.Show(addedRows2.Rows.Count.ToString());

4 つMessageBoxは、次のメッセージを順番に表示します。

Added
3
Added
3

最後のメッセージでカウントが 2 を返すことを期待します。なぜそうではないのですか、これは何らかの方法で修正できますか? 注: DataTable は、テーブルにも特定のデータ ソースにもリンクされていません。

編集: 2 回目に GetChanges() を再クエリしない場合、RowState は OK (Unchanged に設定) であることに注意してください。

4

1 に答える 1

2

GetChangesは行のコピーを返します。データ テーブルにデータ アダプターを使用していますか? MSDN は、DataAdapter で AcceptChanges を呼び出すことを推奨しています。

private void UpdateDataTable(DataTable table, 
    OleDbDataAdapter myDataAdapter)
{
    DataTable xDataTable = table.GetChanges();

    // Check the DataTable for errors.
    if (xDataTable.HasErrors)
    {
        // Insert code to resolve errors.
    }

    // After fixing errors, update the database with the DataAdapter 
    myDataAdapter.Update(xDataTable);
}

編集 データテーブルを使用しているだけなので、追加された行のクエリを作成し、その行で AcceptChanges を呼び出すことができます。

DataRow[] addedRows = datatable.Select(null, null, DataViewRowState.Added);
 foreach (DataRow _ddr in addedRows)
 {
 _ddr.AcceptChanges();
 }
于 2012-04-25T18:15:08.137 に答える