DataRow的RowState属性变化问题
前幾天看到幾篇關于DataSet的文章,露雨城市提出了一個問題——《這個基礎題,你能做對嗎?》,這可難倒了我這樣的菜鳥。覺得有必要研究下。
基礎的信息miclu在《深入理解DataTable與DataRow,DataRowCollection》已經做了介紹,主要涉及了DataTable.AcceptChanges(), DataTable.RejectChanges(), DataTable.NewRow(), DataRow.Delete(), DateRowCollection.RemoveAt(), 而且很詳細,我不再細說,只是想強調一下DataRow的RowState屬性(狀態)。
追根溯源,RowState其實System.Data命名空間下的DataRowState枚舉類型,具體的定義如下:
?
Code?1using?System;
?2
?3?
?4
?5namespace?System.Data
?6
?7{
?8
?9????//?摘要:
10
11????//?????Gets?the?state?of?a?System.Data.DataRow?object.
12
13????[Flags]
14
15????public?enum?DataRowState
16
17????{
18
19????????//?摘要:
20
21????????//?????The?row?has?been?created?but?is?not?part?of?any?System.Data.DataRowCollection.
22
23????????//?????A?System.Data.DataRow?is?in?this?state?immediately?after?it?has?been?created
24
25????????//?????and?before?it?is?added?to?a?collection,?or?if?it?has?been?removed?from?a
26
27????????//?????collection.
28
29????????Detached?=?1,
30
31????????//
32
33????????//?摘要:
34
35????????//?????The?row?has?not?changed?since?System.Data.DataRow.AcceptChanges()?was?last
36
37????????//?????called.
38
39????????Unchanged?=?2,
40
41????????//
42
43????????//?摘要:
44
45????????//?????The?row?has?been?added?to?a?System.Data.DataRowCollection,?and?System.Data.DataRow.AcceptChanges()
46
47????????//?????has?not?been?called.
48
49????????Added?=?4,
50
51????????//
52
53????????//?摘要:
54
55????????//?????The?row?was?deleted?using?the?System.Data.DataRow.Delete()?method?of?the
56
57????????//?????System.Data.DataRow.
58
59????????Deleted?=?8,
60
61????????//
62
63????????//?摘要:
64
65????????//?????The?row?has?been?modified?and?System.Data.DataRow.AcceptChanges()?has?not
66
67????????//?????been?called.
68
69????????Modified?=?16,
70
71????}
72
73}
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()方法是無能為力的。
轉載于:https://www.cnblogs.com/spoony/archive/2009/01/19/datarow-rowstate.html
總結
以上是生活随笔為你收集整理的DataRow的RowState属性变化问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python专家编程
- 下一篇: C#编写简单的聊天程序