C#-DataView及其⽤法
主要是这段代码,使⽤DataView查出⼀个DATATABLE想要的字段,如果使⽤LINQ可以很容易做到,但是 2.0以下版本就不能⽤LINQ了,所以还是⽤这种最好!
DataView myDataView = new DataView(table);
string[] strComuns = { "TABLE_NAME", "COLUMN_NAME", "DATA_TYPE", "", "COLUMN_DEFAULT" };
DataTable DropTable = myDataView.ToTable(true, strComuns);
然后顺便的
DataView类⽤来表⽰定制的DataTable的视图。DataTable和DataView的关系是遵循著名的设计模式--⽂档/视图模式,其中DataTable是⽂档,⽽Dataview是视图。
在任何时候,你都可以有多个基于相同的不同的视图。更重要的是,你可以对每⼀个具有⾃⼰⼀套属性、⽅法、事件的视图作为独⽴的对象进⾏处理。这也代表了相对ADO⼀个巨⼤的飞跃。
创建DataView
public DataView();
public DataView(DataTable);
DataView只有同已经存在的、很可能是⾮空的DataTable对象连接后才可⽤。通常,这个连接在构造时就指定了。
DataView dv;
dv = new DataView(theDataSet.Tables["Employees"]);
但是,你也可以先创建⼀个新的视图,然后再⽤Table属性同表相关联。
DataView dv = new DataView();
dv.Table = theDataSet.Tables["Employees"];
DataView构造函数使你由DataTable中得到⼀个DataView对象。如果需要,反之亦可。事实上,DataTable对象的DefaultView属性返回⼀个该表的DataView对象。DataView dv = dt.DefaultView;
⼀旦你有了DataView对象,你可以利⽤它的属性来建⽴你希望见到的数据⾏集。⼀般,你可以使⽤下列
属性:
RowFilter
Sort
前者可以定制视图中可见数据应匹配的规则。⽽后者通过表达式来进⾏排序。当然你可以使⽤这两者的任意组合。
设置过滤 RowFilter是⼀个可读写的属性,⽤来读取和设置表过滤的表达式。
public virtual string RowFilter {get; set;}
你可以⽤列名,逻辑和数字运算符和常量的任意合法组合组成表达式。以下是⼀些例⼦:
dv.RowFilter = "Country = 'USA'";
dv.RowFilter = "EmployeeID >5 AND Birthdate < #1/31/82#"
dv.RowFilter = "Descrtion LIKE '*product*'"
让我们来看⼀下过滤器的基本规则和运算符。
过滤字符串是表达式的逻辑连接。可以⽤AND,OR,NOT来连接成⼀个较短的表达式,也可以使⽤圆括号来组成⼦句,指定优先的运算。
通常包含列名的⼦句同字母、数字、⽇期或另⼀个列名进⾏⽐较。这⾥,可以使⽤关系运算符和算术运算符,如>=, <, >, +, *, % (取模)等等。
如果要选取的⾏并不能⽅便地通过算术或逻辑运算符表达,你可以使⽤IN操作符。以下代码显⽰如何选取⼀个随机⾏:
dv.RowFilter = "employeeID IN (2,4,5)"
你也可以使⽤通配符*和%,它们同LIKE运算符⼀起使⽤时显得更有⽤。它们都表⽰任意数量的字符,可以相互替代使⽤。
请注意,如果在LIKE⼦句中已经有了*或%字符,你必须⽤⽅括号将其括起,以免歧义。如果很不幸,字符串中⽅括号本⾝也存在了,那么它也必须⽤将本⾝括起。这样,匹配语句会如下所⽰:
dv.RowFilter = "Description LIKE '[[]*[]]product[[]*[]]"
通配符只允许在过滤字符串的开头或结尾处使⽤,⽽不能在字符串中间出现。例如,下列语句会产⽣运⾏时错误:
dv.RowFilter = "Description LIKE 'prod*ct"
字符串必须以单引号括起,⽽⽇期型必须以#符号括起。字符型值可以使⽤⼩数点和科学计数法。
RowFilter也⽀持聚合函数,如SUM, COUNT, MIN,MAX, and AVG。如果表中没有数据⾏,那么函数将返回NULL。
在介绍RowFilter表达式的最后,让我们讨论三个很便利的函数:Len,IIF和Substring。
正如其名,Len()返回特定表达式的长度。该表达式可以是⼀个列名,也可以是其他合法的表达式。
Substring()返回指定的表达式⾃特定位置开始,特定长度的字符⼦串。
我最喜欢⽤的是IIF(),它按照逻辑表达式的值有⼀到两个值。IIF是IF-THEN-ELSE语句的紧凑表达。语法如下:
IIF(expression, if_true, if_false)
通过该函数,可以建⽴⾮常复杂的过滤字符串。例如,假定你从 Server的Northwind中取得Employees表,下列表达式可以选出那些employeeID⼩于6且lastname为偶数个字符和employeeID⼤于6且lastname为奇数个字符的员⼯。
IIF(employeeID<6, Len(lastname) %2 =0, Len(lastname) %2 >0)
预排视图
在上⾯的举例中,datagrid必须负责预排视图中的数据⾏,以便刷新⽤户。这个⾃动机制是.
数据绑定的产物。Datagrid是通过DataSource属性来获取数据的数据绑定控件。DataView是⼀个可数据绑定的类,可构建DataSource属性的内容。
如果你想使⽤datagrid之外的另⼀个控件,应该怎么办呢?⼜如果你不想使⽤⾃动数据绑定呢?应该怎样预排视图中所选的数据⾏呢?
DataView的Table属性指向相应的数据表,但DataTable并不保存过滤信息。所以,预排表中的数据注定是不可⾏的。虽然DataTable和DataView是紧密相联的,但它们各⾃保持独⽴,并执⾏独⽴的功能。
以下Visual Basic .NET代码段显⽰了如何遍历视图中所有的数据⾏,并加⼊到listbox中。
Dim dv As New DataView()
dv = ds.Tables("Employees").DefaultView
dv.RowFilter = "employeeid >5"
ListBox1.Items.Clear()
Dim buf As String
Dim dr As DataRowView
For Each dr In dv
buf = ""
buf &= dr("lastname").ToString()& ", " & dr("firstName").ToString()
ListBox1.Items.Add(buf)
Next
正如前⾯说提到的,DataView是可枚举的类,因此你可以安全的将它传给For..Each语句。Count属性存储了视图中数据⾏数,以便在For..Next循环中使⽤。
要访问视图中某⼀⾏,可以使⽤DataRowView类。DataRowView可表⽰DataRow的视图,就像DataView表达DataTable定制的视图⼀样。
总的来说,DataRow最多有四种状态:default,original,current和proposed。这些状态由DataRowVersion枚举类型设置,由RowVersion属性表达。
DataRow的视图只能是其中某⼀种状态。
数据⾏的默认(default)版本只有当其列在构造时设定了默认值时才有。⽽初始(original)版本是指在最后⼀次调⽤表的AcceptChanges后,从数剧源中得到数据⾏或。当前
(Current)版本是指当前的数据⾏,包括所有当时发⽣的更新。Proposed状态只存在于调⽤BeginEdit和EndEdit的编辑过程中。
可以通过访问DataRow相同的语法访问DataRowView。这⾥最重要的属性叫Item。
排序和其他便捷的特性
DataView⽀持Sort属性,可以⽤来对视图中的内容排序。Sort由⽤逗号分隔的列名表达式进⾏排序。通过在任何列名后加ASC或者DESC限定词,可以使得字段按照上升或者下
降的顺序排列。如果没有⽅向限定词,默认顺序为ASC。
DataView是内存中的对象,所以排序在本地进⾏,⽆需调⽤数据库。
RowStateFilter是DataView另⼀有趣的属性。它可以⽤任何预定义的标准来过滤DataTable中的内容。下表中是DataViewRowState枚举类型的所有取值:
CurrentRows包括所有未更新的、新的和修改的数据⾏
Deleted所有⾃上次调⽤AcceptChanges后删除的数据⾏
ModifiedCurrent所有⾃上次调⽤AcceptChanges后修改过的数据⾏
ModifiedOriginal所有⾃上次调⽤AcceptChanges后original版本的数据⾏
New所有⾃上次调⽤AcceptChanges后新添加的⾏
OriginalRows返回初始数据⾏,包含unchanged和deleted 的
Unchanged所有未更新的数据⾏
如果要操作⾮连接的数据,所有更新都在对DataTable调⽤AcceptChanges后⽣效。对单⼀⾏的更新在调⽤DataRow的AcceptChanges后⽣效。类似的,这些更新可以通过调⽤
DataTable或DataRow对象的RejectChanges来取消。
DataView对象还有⼀些属性,如AllowEdit,AllowDelete和AllowNew,⽤来得到或设定是否允许更新的值。它们的默认值设为True,允许任何种类的更新。如果在标志设为
False时,你想要完成相应的更新操作,会有⼀个运⾏时错误发⽣。
DataViewManager类
DataTable对象的DefaultView属性⽤来返回⼀个DataView对象,作为数据表中内容的默认视图。它按照⾃然顺序读取数据并显⽰表中所有的⾏,⽽不使⽤任何过滤。
theMasterGrid.DataSource = m_ds.Tables("Employees").DefaultView
如果需要数据特定的视图,你可以进⾏排序并/或对DefaultView对象直接进⾏过滤。
m_ds.Tables("Employees").DefaultView.Sort = "lastname"
theMasterGrid.DataSource = m_ds.Tables("Employees").DefaultView
DataViewManager类是⽤来存储DataSet中所有表的视图设置。
可以通过传递⼀个合法的⾮空的DataSet给类的构造函数来创建DataViewManager
Dim dvm As DataViewManager
dvm = New DataViewManager(m_ds)
也可以通过DataSet对象的DefaultViewManager属性直接得到:
Dim dvm As DataViewManager = m_ds.DefaultViewManager
重要的是DataViewManager类是同⼀个DataSet相关联的。下⾯是另⼀种可⾏的⽅法:
Dim dvm As New DataViewManager()
dvm.DataSet = m_ds
DataViewManager最重要的属性是DataViewSettings,⼀个DataViewSetting对象的集合。
Dim dvs As DataViewSetting
dvs = dvm.DataViewSettings("Employees")
dvs.Sort = "lastname"
DataViewSetting对象包含了表视图的参数信息。当将数据绑定到对数据敏感的控件时,使⽤DataViewManager⽽不是DataSet或DataTable可以保留你的视图设置(过滤和排序
字段)
theMasterGrid.DataSource = dvm
theMasterGrid.DataMember = "Employees"
在这⾥,视图按照DataViewSetting中对Employees表指定的⾃动进⾏排序和过滤。换⽽⾔之,DataViewSetting类是对特定表的视图的⼀种缓存。
字符串常量的用法//默认显⽰ void ViewData(DataTable dt) { DataView dv = new DataView(dt); //或者DataView dv=dt.DataView(); this.DataList1.DataSource = dv; this.DataList1.DataBind(); } //倒序显⽰ void ViewData_Sort(DataTable dt) { DataView dv = new DataV

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。