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()方法是无能为力的。