DataTable,DataView和DataGrid中一些容易混淆的概念
一、DataTable
??
?? DataTable表示內(nèi)存中數(shù)據(jù)的一個(gè)表,它完全是在內(nèi)存中的一個(gè)獨(dú)立存在,包含了這張表的全部信息。DataTable可以是從通過連接從數(shù)據(jù)庫中讀取出來形成的一個(gè)表,一旦將內(nèi)容讀到DataTable中,此DataTable就可以跟數(shù)據(jù)源斷開而獨(dú)立存在;也可以是完全由程序自己通過代碼來建立的一個(gè)表。
??
??◆ DataColumn
??
??一個(gè)表是由行和列組成的一個(gè)兩維的結(jié)構(gòu)。表的結(jié)構(gòu)是由DataColumn 對(duì)象的集合組成,DataColumn 對(duì)象集合可由DataTable.Columns 屬性中能獲取到,通過定義每一列的數(shù)據(jù)類型來確定表的架構(gòu),類似數(shù)據(jù)庫中定義表。定義完表的結(jié)構(gòu)就可以根據(jù)結(jié)構(gòu)來生成DataRow,用DataTable.NewRow()方法來生成此DataTable結(jié)構(gòu)的新行。
??一個(gè)DataTable是由DataRow的集合組成的, DataRow的集合這個(gè)可以由DataTable.Rows 屬性來訪問。
??
??DataTable還可以通過現(xiàn)有的列用Expression 屬性的表達(dá)式創(chuàng)建一些列。
??
??1、創(chuàng)建計(jì)算出的列
??比如:已經(jīng)有了一個(gè)表結(jié)構(gòu),表中有一個(gè)DataColumn的集合,其中有一個(gè)叫UnitPrice的列,你可以新建一個(gè)DataColumn,設(shè)置好ColumnName,再設(shè)置此列的表達(dá)式,DataColumn.Expression = "UnitPrice * 0.086",這個(gè)列的值就是名字為UnitPrice的列計(jì)算出來的,在創(chuàng)建表達(dá)式時(shí),使用 ColumnName 屬性來引用列。
??
??2、第二個(gè)用途是創(chuàng)建聚合列
??聚合列聚合通常沿著關(guān)系執(zhí)行(有關(guān)關(guān)系的描述見下面DataRelation部分),如果order表有名為 detail 的子表,兩個(gè)表之間通過order.orderid和detail.orderid兩個(gè)列建立一個(gè)關(guān)系 DataRelation 對(duì)象名為“order2detail”,在主表order中就可以建立一個(gè)聚合列,將計(jì)算每個(gè)order在detail表中含有的所有item的價(jià)格的和:DataColumn.Expression = “sum(child(order2detail).price)",child(order2detail)表示通過關(guān)系order2detail聯(lián)系到的子表,child(order2detail).price就表示子表的price列。
??
??◆ DataRow
??
??DataRow對(duì)象沒有直接在代碼中使用的構(gòu)造函數(shù),一般是從具有一定結(jié)構(gòu)的DataTable用NewRow()方法來新建一個(gè)DataRow對(duì)象。一個(gè)DataRow根據(jù)其是獨(dú)立的,還是屬于某個(gè)DataTable,是否修改過,是否被DataTable刪除等等不同的情況有不同的狀態(tài),由DataRow.RowState屬性公開,如下表:
??
??
??成員名稱 說明
??Added 該行已添加到 DataRowCollection 中,AcceptChanges 尚未調(diào)用。Deleted 該行已通過 DataRow 的 Delete 方法被刪除。
??Deleted 該行已通過 DataRow 的 Delete 方法被刪除。
??Detached 該行已被創(chuàng)建,但不屬于任何 DataRowCollection。DataRow 在以下情況下立即處于此狀態(tài):創(chuàng)建之后添加到集合中之前;或從集合中移除之后。
??Modified 該行已被修改,AcceptChanges 尚未調(diào)用。
??Unchanged 該行自上次調(diào)用 AcceptChanges 以來尚未更改。
??
??一個(gè)DataRow對(duì)象剛被創(chuàng)建之后其狀態(tài)是Detached,是孤立的一個(gè)存在,所以建立了DataRow之后在DataRow中的單元填充了數(shù)據(jù)后還要通過DataTable.Rows.Add(DataRow)方法將此DataRow添加到DataTable,DataRow添加到DataTable后, 這個(gè)DataRow的狀態(tài)就轉(zhuǎn)變?yōu)锳dded。當(dāng)修改了這個(gè)DataRow后,這個(gè)DataRow狀態(tài)轉(zhuǎn)為Modified,當(dāng)用DataRow.Delete()方法刪除DataRow后,DataRow狀態(tài)將轉(zhuǎn)為Deleted,不過此行還存在在DataTable中的,只是狀態(tài)改變了,這時(shí)用DataTable.Rows.Count查看行數(shù),跟刪除前是一樣的。只有在調(diào)用了DataTable.Remove(DataRow)方法后,此DataRow才被從DataTable移除,狀態(tài)也回復(fù)到Detached孤立狀態(tài)。
??
??一旦調(diào)用了DataTable.AcceptChanges()方法后,所有的行將根據(jù)不同的狀態(tài)做不同的處理,Added、Modified、Unchanged將保留當(dāng)前值,Deleted的行將從DataTable中移除,最后所有的行的狀態(tài)都置為Unchanged。當(dāng)DataTable是從DataAdapter.Fill(DataSet,DataTable)方法填充而形成的,Fill()方法將自動(dòng)調(diào)用AcceptChanges()方法,將DataTable的行狀態(tài)都置為Unchanged。并且,如果Fill方法中指定的那個(gè)DataTable在要填充的那個(gè)DataSet不存在時(shí),會(huì)生成一個(gè)跟數(shù)據(jù)源表同樣的結(jié)構(gòu)的DataTable并填充數(shù)據(jù)。
??
??◆ DataRelation
??
??表示兩個(gè) DataTable 對(duì)象之間的父/子關(guān)系。可以類比于數(shù)據(jù)庫中的表之間的關(guān)系,父表相當(dāng)于關(guān)系列為主鍵的表,子表相當(dāng)于關(guān)系列為外鍵的表。DataRelation 構(gòu)造函數(shù)一般為:DataRelation(String, DataColumn, DataColumn) ,string為關(guān)系名,第一個(gè)DataColumn為建立關(guān)系的父表列,第二個(gè)DataColumn為建立關(guān)系的子表列,建立關(guān)系的兩個(gè)列的 DataType 值必須相同。
??
??建立好了關(guān)系,必須把這個(gè)關(guān)系加入到DataTable的ParentRelations屬性或ChildRelations 屬性,這兩個(gè)屬性包含這個(gè)表的所有的跟父表的關(guān)系和跟子表的關(guān)系。若關(guān)系中此表是父表則將此關(guān)系加入到ChildRelations集合中,否則加入到ParentRelations集合中。
??
??二、DataView
??
??DataView表示用于排序、篩選、搜索、編輯和導(dǎo)航的 DataTable 的可綁定數(shù)據(jù)的自定義視圖。可以將DataView同數(shù)據(jù)庫的視圖類比,不過有點(diǎn)不同,數(shù)據(jù)庫的視圖可以跨表建立視圖,DataView則只能對(duì)某一個(gè)DataTable建立視圖。DataView一般通過DataTable.DefaultView 屬性來建立,再通過通過RowFilter 屬性和RowStateFilter 屬性建立這個(gè)DataTable的一個(gè)子集。
??
??RowFilter屬性用來篩選要查看DataTable中哪些行的表達(dá)式,這個(gè)表達(dá)式同上面所說的建立計(jì)算列的表達(dá)式相同。例如:"LastName = Smith ",這就是只查看列LastName的值為 Smith 的那些數(shù)據(jù)行。
??
??RowStateFilter 屬性用來設(shè)置 DataView 中的行狀態(tài)篩選器,上面介紹DataRow時(shí)介紹了DataRow的狀態(tài),一個(gè)DataRow可能有五種狀態(tài),RowStateFilter就是可以通過這些狀態(tài)來篩選要查看的行集。其實(shí)DataRow不僅有五種狀態(tài),DataRow還有版本的問題,比如當(dāng)DataRow的狀態(tài)為Modified,即這行已經(jīng)被修改了,這時(shí)這個(gè)DataRow就會(huì)有兩個(gè)版本,Current版本和Original版本(修改前的)。實(shí)際上RowStateFilter屬性是綜合了DataRow的狀態(tài)和版本來篩選的(RowStateFilter確省值是CurrentRows)見下表:
??
??成員名稱 說明
??Added 一個(gè)新行。
??CurrentRows 包括未更改行、新行和已修改行的當(dāng)前行。
??Deleted 已刪除的行。
??ModifiedCurrent 當(dāng)前版本,原始數(shù)據(jù)(請(qǐng)參閱 ModifiedOriginal)的修改版本。
??ModifiedOriginal 原始版本(盡管它后來已被修改并以 ModifiedCurrent 形式存在)。
??None 無。
??OriginalRows 包括未更改行和已刪除行的原始行。
??Unchanged 未更改的行。
??
??DataView.Count屬性得到的計(jì)數(shù)是在應(yīng)用了 RowFilter 和 RowStateFilter 之后,獲取 DataView 中記錄的數(shù)量。
??
??DataView是建立在DataTable基礎(chǔ)上的,DataView.Table 屬性可以得到此DataView對(duì)應(yīng)的那個(gè)DataTable。DataView的行叫DataRowView,可以從DataRowView直接通過DataRowView.Row 屬性得到此DataRowView對(duì)應(yīng)的DataRow。
??
??三、DataGrid
??
??這里說的DataGrid是winform中的DataGrid,一般都是跟DataView綁定來顯示DataTable中的數(shù)據(jù),和修改DataTable中的數(shù)據(jù)。
??DotNet的DataGrid的功能強(qiáng)大,可是在使用上與以前的習(xí)慣不太一樣,有時(shí)還比較麻煩,所以很多人都對(duì)這個(gè)DataGrid感到有些摸不著頭腦,有一種無從下手的感覺,其實(shí)把一些概念搞清楚了許多問題就會(huì)迎刃而解了。
??
??DataGrid通過DataSource 和 DataMember 屬性來綁定其要顯示的數(shù)據(jù)源。數(shù)據(jù)源一般是DataTable、DataView、DataSet等,不過將這些數(shù)據(jù)源綁定到DataGrid時(shí)實(shí)際上是綁定的DataView。若數(shù)據(jù)源是DataTable時(shí),實(shí)際上是綁定了此DataTable的DefaultView,若數(shù)據(jù)源是DataSet時(shí),則可以向 DataMember 屬性設(shè)置一個(gè)字符串,該字符串指定要綁定到的表,然后再將DataMember指定的那個(gè)DataTable的DefaultView綁定到DataGrid。
??
??所以DataGrid實(shí)際顯示的是DataTable經(jīng)過篩選的DataView。
轉(zhuǎn)載于:https://www.cnblogs.com/zhengxiqiang/archive/2009/07/26/1531301.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的DataTable,DataView和DataGrid中一些容易混淆的概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 主机路由在计算机中的应用
- 下一篇: 魔改和上线你的合成大西瓜,最全教程!