DataRow的RowState属性(状态)取值有5种:Detached, Unchanged, Added, Deleted, Modified。
当我们用DataRow newRow = DataTable.NewRow();方法产生一个新的DataRow时,它的状态是Detached. 然后我们会将这个newRow用DataTable.Rows.Add(newRow); 方法添加到DataTable中。此时newRow的状态是Added, 这个时候执行DataTable.AcceptChanges()方法,提交改动。此时newRow的状态是Unchanged, 这个时候呢,当然可以执行newRow.Delete()操作或是DataTable.Remove(newRow)或是编辑这一行啊,但是注意此时执行之后对应的状态分别是Deleted, Detached, Modified. 如果再执行DataTable.AcceptChanges()方法,提交改动状态分别是Detached, Detached, Unchanged. 而 newRow.Delete()与DataTable.Remove(newRow)的区别就是newRow.Delete()并没有直接从DataTable里移除newRow, 而只是将其状态变为Deleted, 因此需要调用DataTable.AcceptChanges()提交更改才能移除,移除的概念是将其状态变为Detached, 并没有真的将newRow消灭,而DataTable.Remove(newRow)方法直接将newRow状态变为Detached, 不用再调用DataTable.AcceptChanges()提交更改。但如果在newRow状态为Added的时候执行newRow.Delete(), 那就直接移除,并将其状态变为Detached. 有提交更改自然也有与之对应的回滚操作DataTable.RejectChanges(), 值得注意的是回滚操作会分别将状态为Added, Deleted, Modified, 统统变为最近一次的Unchanged.对于状态已经为Detached的,DataTable.RejectChanges()方法是无能为力的。
下面是更详细的讲解: