【包括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
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决