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

4MessageBox按顺序显示以下消息:

Added
3
Added
3

我希望计数在最后一条消息上返回 2。为什么不是这种情况,可以通过任何方式解决吗?注意:DataTable 未链接到表或特定数据源。

编辑:请注意,如果我第二次不重新查询 GetChanges(),则 RowState 可以(设置为未更改)

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 回答