DataRow的RowState屬性變化問題

2022-02-19 13:23:44 字數 2281 閱讀 8161

前幾天看到幾篇關於dataset的文章,

露雨城市

提出了乙個問題——《

這個基礎題,你能做對嗎?

》,這可難倒了我這樣的菜鳥。覺得有必要研究下。

基礎的資訊

miclu

在《深入理解datatable與datarow,datarowcollection

》已經做了介紹,主要涉及了datatable.acceptchanges(), datatable.rejectchanges(), datatable.newrow(), datarow.delete(), daterowcollection.removeat(), 而且很詳細,我不再細說,只是想強調一下datarow的rowstate屬性(狀態)。

追根溯源,rowstate其實system.data命名空間下的datarowstate列舉型別,具體的定義如下:

code

1using

system;23

45

namespace

system.data67

7273}74

75具體解釋很簡單,不再翻譯。可以看出

datarow

的rowstate

屬性(狀態)取值有5種:

detached, unchanged, added, deleted, modified.

當我們用

datarow newrow = datatable.newrow();

方法產生乙個新的

datarow

時,它的狀態是

detached.

可能有人要問:「為什麼不是

system.data.datarow dr = new system.data.datarow();

呢?」這一點請看

蠟人張的一篇隨筆《

為什麼system.data.datarow類例項化時沒有構造

?》然後我們會將這個

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

方法是無能為力的。

關於datarow的狀態

發現沒有新增到datatable中的行刪除則為detached,新增之後則為deleted。msdn對rowstate的說明 detached 該行已被建立,但不屬於任何 datarowcollection。datarow 在以下情況下立即處於此狀態 建立之後新增到集合中之前 或從集合中移除之後。u...

DataRow的序列化問題

在.裡,datarow型別的物件是不支援序列化的,那麼如果在乙個需要序列化的物件中含有datarow型別的字段該怎麼辦呢?呵呵,幸好datatable是支援序列化的。因此,我們可以自定義序列化的行為,並在序列化和反序列化的時候用datatable來對datarow進行包裝和解包。為了自定義序列化行為...

C 行 datarow 拷貝方法

有兩個表a和b,兩表結構相同。現在需要將a表中部分行拷貝到b表中。如果我們直接用 datatableb.rows.add datatablea.rows 0 這樣的方法式會報 row已經屬於a表 這樣的錯誤。所以我們可以用另外的方法。注意 這裡切記,b表一定要與a表有一樣的表結構才能正確使用下面的複...