一、DataTable datatable表示中数据的一个表,它完全是在内存中的一个独立存在,包含了这张表的全部信息。datatable可以是从通过连接从数剧库中读取出来形成的一个表,一旦将内容读到datatable中,此datatable就可以跟数据源断开而独立存在;也可以是完全由程序自己代码通过来建立的一个表。 ◆ DataColumn 一个表是由行和列组成的一个两维的结构。表的结构是由datacolumn 对象的集合组成,DataColumn 对象集合可由DataTable.Columns 属性中能获取到,通过定义每一列的数据类型来确定表的架构,类似数据库中定义表。定义完表的结构就可以根据结构来生成DataRow,用DataTable.NewRow()方法来生成此DataTable结构的新行。 datatable还可以通过现有的列用expression 属性的表达式创建一些列。 1、创建计算出的列 2、第二个用途是创建聚合列 ◆ DataRow datarow对象没有直接在代码中使用的构造函数,一般是从具有一定结构的datatable用newrow()方法来新建一个datarow对象。一个datarow根据其是独立的,还是属于某个datatable,是否修改过,是否被datatable删除等等不同的情况有不同的状态,由datarow.rowstate属性公开,如下表:
一个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的一个子集。 rowfilter属性用来筛选要查看datatable中哪些行的表达式,这个表达式同上面所说的建立计算列的表达式相同。例如:"lastname = 'Smith'",这就是只查看列LastName的值为'Smith'的那些数据行。 rowstatefilter 属性用来设置 DataView 中的行状态筛选器,上面介绍DataRow时介绍了DataRow的状态,一个DataRow可能有五种状态,RowStateFilter就是可以通过这些状态来筛选要查看的行集。其实DataRow不仅有五种状态,DataRow还有版本问题,比如当DataRow的状态为Modified,即这行已经被修改了,这时这个DataRow就会有两个版本,Current版本和Original版本(修改前的)。实际上RowStateFilter属性是DataRow的状态和版本来筛选的(RowStateFilter确省值是CurrentRows)见下表:
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中的数据。 datagrid通过datasource 和 DataMember 属性来绑定其要显示的数据源。数据源一般是DataTable、DataView、DataSet等,不过将这些数据源绑定到DataGrid时实际上是绑定的DataView。若数据源是DataTable时,实际上是绑定了此DataTable的DefaultView,若数据源是DataSet时,则可以向 DataMember 属性设置一个字符串,该字符串指定要绑定到的表,然后再将DataMember指定的那个DataTable的DefaultView绑定到DataGrid。 所以datagrid实际显示的是datatable经过筛选的dataview。 |