没有合适的资源?快使用搜索试试~ 我知道了~
DataTable,DataView和DataGrid中一些容易混淆的概念
需积分: 10 29 下载量 163 浏览量
2007-11-02
09:58:10
上传
评论
收藏 220KB PDF 举报
温馨提示
试读
13页
DataTable,DataView和DataGrid中一些容易混淆的概念
资源推荐
资源详情
资源评论
1
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。
剩余12页未读,继续阅读
资源评论
wj4064
- 粉丝: 6
- 资源: 31
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功