DataRow的RowState属性变化问题

前几天看到几篇关于DataSet的文章,露雨城市提出了一个问题——《这个基础题,你能做对吗?,这可难倒了我这样的菜鸟。觉得有必要研究下。

基础的信息miclu在《深入理解DataTableDataRow,DataRowCollection已经做了介绍,主要涉及了DataTable.AcceptChanges(), DataTable.RejectChanges(), DataTable.NewRow(), DataRow.Delete(), DateRowCollection.RemoveAt(), 而且很详细,我不再细说,只是想强调一下DataRowRowState属性(状态)。

追根溯源,RowState其实System.Data命名空间下的DataRowState枚举类型,具体的定义如下:

 

Code

  

具体解释很简单,不再翻译。可以看出DataRowRowState属性(状态)取值有5种:Detached, Unchanged, Added, Deleted, Modified. 当我们用DataRow newRow = DataTable.NewRow();方法产生一个新的DataRow时,它的状态是Detached. 可能有人要问:“为什么不是System.Data.DataRow dr = new System.Data.DataRow();呢?”这一点请看蜡人张的一篇随笔为什么System.Data.DataRow类实例化时没有构造? 然后我们会将这个newRowDataTable.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()方法是无能为力的。

posted @ 2009-01-19 16:49  spoony  阅读(3707)  评论(5编辑  收藏  举报