DataRow的RowState属性

datarow的rowstate属性(状态)取值有5种:detached, unchanged, added, deleted, modified.

当我们用datarow newrow = datatable.newrow();方法产生一个新的datarow时,

它的状态是detached,意为“分离”,如果把一个datatable理解为一个果盘,那么状态为detached的datarow可以理解为放在果盘(datatable)外的苹果(datarow).

可能有人要问:“为什么不是system.data.datarow dr = new system.data.datarow();呢?

因为在如果要使用构造函数实例化一个数据行时,根本无法确定该数据行的结构,需要由表的结构来确定行的结构。

所以不应该是:

 system.data.datarow dr = new system.data.datarow();
 
而应该是:

         system.data.datarow dr = dt.newrow();        //dt是一个包含列集合的datatable


然后会将这个newrow用datatable.rows.add(newrow); 方法添加到datatable中。
此时newrow的状态是added, 这个时候执行datatable.acceptchanges()方法,提交改动。此时newrow的状态是unchanged, 这个时候呢,当然可以执行newrow.delete()操作或是datatable.remove(newrow)或是编辑这一行啊,

但是注意此时执行之后对应的状态分别是(执行删除后)deleted, (执行remove后)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 @ 2010-12-13 19:16  代码缔造的帝国  阅读(291)  评论(0编辑  收藏  举报