Mathieu
Mathieu

Reputation: 4520

DataRow.AcceptChanges won't keep the new RowState

This test code is really straightforward

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());

The 4 MessageBox show, in order, the following messages:

Added
3
Added
3

I would expect the count to return 2 on the last message. Why isn't that the case and can this be fixed by any mean? Note: The DataTable is not linked to a table nor a particular data source.

EDIT: Note that the RowState is ok (set to Unchanged) if I don't requery the GetChanges() the second time

Upvotes: 0

Views: 2353

Answers (1)

Josh
Josh

Reputation: 10614

GetChanges returns a copy of the rows. Are you using a data adapter to fill your data table? MSDN recommends calling AcceptChanges on the DataAdapter'

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);
}

Edit Since you are just using a datatable, you could create a query for the rows that are added and call AcceptChanges on that row:

DataRow[] addedRows = datatable.Select(null, null, DataViewRowState.Added);
 foreach (DataRow _ddr in addedRows)
 {
 _ddr.AcceptChanges();
 }

Upvotes: 2

Related Questions