【包括state:detached, modifed,added,deleted等】DataTable,DataView和DataGrid中一些讲解

原文:http://wenku.baidu.com/link?url=Y6ocXi0kaGwxVtQlk4OI8NuEhCAiS34MhWBlLzLjtIu2bE7-CgyR17PdRNOzTxb-vNdIMLEB3tUD0_z8jYOtA5-Wlz4uwwHVzlKrCm4EpBG

 

DataTable,DataView

DataGrid

中一些容易混淆的概念

 

一、

DataTable 

    DataTable

表示内存中数据的一个表,它完全是在内存中的一个独立存在,包含了这张表的全部信息。

DataTable

可以是从通过连接从

数据库中读取出来形成的一个表,

一旦将内容读到

DataTable

中,

DataTable

就可以跟数据源断开而独立存在;

也可以是完全由程序自

己通过代码来建立的一个表。

 

 DataColumn 

一个表是由行和列组成的一个两维的结构。

表的结构是由

DataColumn 

对象的集合组成,

DataColumn 

对象集合可由

DataTable.Columns 

属性中能获取到,通过定义每一列的数据类型来确定表的架构,类似数据库中定义表。定义完表的结构就可以根据结构来生成

DataRow

DataTable.NewRow

()方法来生成此

DataTable

结构的新行。

 

一个

DataTable

是由

DataRow

的集合组成的,

 DataRow

的集合这个可以由

DataTable.Rows 

属性来访问。

 

DataTable

还可以通过现有的列用

Expression 

属性的表达式创建一些列。

 

1

、创建计算出的列

 

比如:已经有了一个表结构,表中有一个

DataColumn

的集合,其中有一个叫

UnitPrice

的列,你可以新建一个

DataColumn

,设置好

ColumnName

,再设置此列的表达式,

DataColumn.Expression = "UnitPrice * 0.086"

,这个列的值就是名字为

UnitPrice

的列计算出来的,

在创建表达式时,使用

 ColumnName 

属性来引用列。

 

2

、第二个用途是创建聚合列

 

聚合列聚合通常沿着关系执行(有关关系的描述见下面

DataRelation

部分),如果

order

表有名为

 detail 

的子表,两个表之间通过

order.orderid

detail.orderid

两个列建立一个关系

 DataRelation 

对象名为

“order2detail”

,在主表

order

中就可以建立一个聚合列,将计

算每个

order

detail

表中含有的所有

item

的价格的和:

DataColumn.Expression = “sum(child(order2detail).price)",child(order2detail)

示通过关系

order2detail

联系到的子表,

child(order2detail).price

就表示子表的

price

列。

 

 

 DataRow 

DataRow

对象没有直接在代码中使用的构造函数,一般是从具有一定结构的

DataTable

NewRow

()方法来新建一个

DataRow

对象。

一个

DataRow

根据其是独立的,还是属于某个

DataTable

,是否修改过,是否被

DataTable

删除等等不同的情况有不同的状态,由

DataRow.RowState

属性公开,如下表:

 

 

 

成员名称

 

说明

 

 

2

 

Added 

该行已添加到

 DataRowCollection 

中,

AcceptChanges 

尚未调用。

Deleted 

该行已通过

 DataRow 

 Delete 

方法被删除。

 

Deleted 

该行已通过

 DataRow 

 Delete 

方法被删除。

 

Detached 

该行已被创建,但不属于任何

 DataRowCollection

DataRow 

在以下情况下立即处于此状态:创建之后添加到集合中之前;或从

集合中移除之后。

 

Modified 

该行已被修改,

AcceptChanges 

尚未调用。

 

Unchanged 

该行自上次调用

 AcceptChanges 

以来尚未更改。

 

一个

DataRow

对象刚被创建之后其状态是

Detached

,是孤立的一个存在,所以建立了

DataRow

之后在

DataRow

中的单元填充了数据

后还要通过

DataTable.Rows.Add(DataRow)

方法将此

DataRow

添加到

DataTable

DataRow

添加到

DataTable

这个

DataRow

的状

态就转变为

Added

。当修改了这个

DataRow

后,这个

DataRow

状态转为

Modified

,当用

DataRow.Delete

()方法删除

DataRow

后,

DataRow

状态将转为

Deleted

,不过此行还存在在

DataTable

中的,只是状态改变了,这时用

DataTable.Rows.Count

查看行数,跟删除

前是一样的。只有在调用了

DataTable.Remove(DataRow)

方法后,此

DataRow

才被从

DataTable

移除,状态也回复到

Detached

孤立状

态。

 

一旦调用了

DataTable.AcceptChanges

()方法后,所有的行将根据不同的状态做不同的处理,

Added

Modified

Unchanged

将保留当

前值,

Deleted

的行将从

DataTable

中移除,最后所有的行的状态都置为

Unchanged

。当

DataTable

是从

DataAdapter.Fill

DataSet

DataTable

)方法填充而形成的,

Fill

()方法将自动调用

AcceptChanges

()方法,将

DataTable

的行状态都置为

Unchanged

。并且,

如果

Fill

方法中指定的那个

DataTable

在要填充的那个

DataSet

不存在时,会生成一个跟数据源表同样的结构的

DataTable

并填充数据。

 

 DataRelation 

表示两个

 DataTable 

对象之间的父

/

子关系。可以类比于数据库中的表之间的关系,父表相当于关系列为主键的表,子表相当于关系列为

外键的表。

DataRelation 

构造函数一般为:

DataRelation(String, DataColumn, DataColumn) 

string

为关系名,第一个

DataColumn

建立关系的父表列,第二个

DataColumn

为建立关系的子表列,建立关系的两个列的

 DataType 

值必须相同。

 

建立好了关系,必须把这个关系加入到

DataTable

ParentRelations

属性或

ChildRelations 

属性,这两个属性包含这个表的所有的跟父

表的关系和跟子表的关系。若关系中此表是父表则将此关系加入到

ChildRelations

集合中,否则加入到

ParentRelations

集合中。

 

二、

DataView 

DataView

表示用于排序、筛选、搜索、编辑和导航的

 DataTable 

的可绑定数据的自定义视图。可以将

DataView

同数据库的视图类比,

不过有点不同,数据库的视图可以跨表建立视图,

DataView

则只能对某一个

DataTable

建立视图。

DataView

一般通过

DataTable.DefaultView 

属性来建立,再通过通过

RowFilter 

属性和

RowStateFilter 

属性建立这个

DataTable

的一个子集。

 

 

3

RowFilter

属性用来筛选要查看

DataTable

中哪些行的表达式,这个表达式同上面所说的建立计算列的表达式相同。例如:

"LastName = 

'Smith'"

,这就是只查看列

LastName

的值为

'Smith'

的那些数据行。

 

RowStateFilter 

属性用来设置

 DataView 

中的行状态筛选器,

上面介绍

DataRow

时介绍了

DataRow

的状态,

一个

DataRow

可能有五种

状态,

RowStateFilter

就是可以通过这些状态来筛选要查看的行集。其实

DataRow

不仅有五种状态,

DataRow

还有版本的问题,比如当

DataRow

的状态为

Modified

,即这行已经被修改了,这时这个

DataRow

就会有两个版本,

Current

版本和

Original

版本(修改前的)。

实际上

RowStateFilter

属性是综合了

DataRow

的状态和版本来筛选的(

RowStateFilter

确省值是

CurrentRows

)见下表:

 

 

成员名称

 

说明

 

 

Added 

一个新行。

 

CurrentRows 

包括未更改行、新行和已修改行的当前行。

 

Deleted 

已删除的行。

 

 

ModifiedCurrent 

当前版本,原始数据(请参阅

 ModifiedOriginal

)的修改版本。

 

ModifiedOriginal 

原始版本(尽管它后来已被修改并以

 ModifiedCurrent 

形式存在)。

 

None 

无。

 

 

OriginalRows 

包括未更改行和已删除行的原始行。

 

 

Unchanged 

未更改的行。

 

 

DataView.Count

属性得到的计数是在应用了

 RowFilter 

 RowStateFilter 

之后,获取

 DataView 

中记录的数量。

 

DataView

是建立在

DataTable

基础上的,

DataView.Table 

属性可以得到此

DataView

对应的那个

DataTable

DataView

的行叫

DataRowView

,可以从

DataRowView

直接通过

DataRowView.Row 

属性得到此

DataRowView

对应的

DataRow

 

三、

DataGrid 

这里说的

DataGrid

winform

中的

DataGrid

,一般都是跟

DataView

绑定来显示

DataTable

中的数据,和修改

DataTable

中的数据。

 

DotNet

DataGrid

的功能强大,可是在使用上与以前的习惯不太一样,有时还比较麻烦,所以很多人都对这个

DataGrid

感到有些摸不

着头脑,有一种无从下手的感觉,其实把一些概念搞清楚了许多问题就会迎刃而解了。

 

DataGrid

通过

DataSource 

 DataMember 

属性来绑定其要显示的数据源。数据源一般是

DataTable

DataView

DataSet

等,不过将

这些数据源绑定到

DataGrid

时实际上是绑定的

DataView

。若数据源是

DataTable

时,实际上是绑定了此

DataTable

DefaultView

,若

数据源是

DataSet

时,则可以向

 DataMember 

属性设置一个字符串,该字符串指定要绑定到的表,然后再将

DataMember

指定的那个

DataTable

DefaultView

绑定到

DataGrid

posted @   阿玛  阅读(215)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示