ADO。NET之dataview(六)
DataView 使您能够创建 DataTable 中所存储的数据的不同视图,这种功能通常用于数据绑定应用程序。使用 DataView,您可以公开表中具有不同排序顺序的数据,并且可以按行状态或基于筛选器表达式来筛选数据。
DataView 提供数据的动态视图,其内容、排序和成员关系会实时反映对基础 DataTable 的更改。它不同于 DataTable 的 Select 方法,后者从表中按特定的筛选器和/或排序顺序返回 DataRow 数组,虽然其内容反映对基础表的更改,但其成员关系和排序却则保持静态。DataView 的动态功能使其成为数据绑定应用程序的理想选择。
与数据库提供的视图类似,DataView 为您提供了可向其应用不同排序和筛选条件的单个数据集的动态视图。但是,DataView 和数据库视图之间相当不同的一点在于 DataView 不能作为表来进行处理,并且不能提供联接表的视图。另外,还不能排除存在于源表中的列,也不能追加不存在于源表中的列(如计算列)。
可以使用 DataViewManager 来管理 DataSet 中所有表的视图设置。DataViewManager 为您提供了一种方便的方法来管理每个表的默认视图设置。在将一个控件绑定到 DataSet 的多个表时,绑定到 DataViewManager 是理想的选择。
创建:
创建 DataView 的方法有两种。可以使用 DataView 构造函数,也可以创建对 DataTable 的 DefaultView 属性的引用。DataView 构造函数可以为空,也可以通过单个参数的形式采用 DataTable 或者同时采用 DataTable 与筛选条件、排序条件和行状态筛选器。
[C#]
DataView custDV = new DataView(custDS.Tables["Customers"],
"Country = 'USA'",
"ContactName",
DataViewRowState.CurrentRows);
DataView custDV = custDS.Tables["Customers"].DefaultView;
使用 DataView 对数据排序和筛选
DataView 提供了几项用于对 DataTable 中的数据进行排序和筛选的功能:
- 使用 Sort 属性,您可以指定单个或多个列排序顺序并包含 ASC(升序)和 DESC(降序)参数。
- 可以使用 ApplyDefaultSort 属性自动以升序创建基于表的一个或多个主键列的排序顺序。只有当 Sort 属性为空引用或空字符串时以及表已定义主键时,ApplyDefaultSort 才适用。
- 使用 RowFilter 属性,您可以根据行的列值来指定行的子集。有关 RowFilter 属性的有效表达式的更多信息,请参见有关 DataColumn 类的 Expression 属性的参考信息。
如果要返回对数据的特定查询的结果(而不是提供数据子集的动态视图)以实现最佳性能,请使用 DataView 的 Find 或 FindRows 方法,而不是设置 RowFilter 属性。设置 RowFilter 属性会使数据的索引被重新生成,从而增加应用程序的系统开销并降低性能。最好将 RowFilter 属性用于其中的绑定控件显示筛选结果的数据绑定应用程序。Find 和 FindRows 方法会利用当前的索引,而不需要重新生成索引。有关 Find 和 FindRows 方法的更多信息,请参见搜索 DataView。
- 使用 RowStateFilter 属性,您可以指定要查看的行版本。DataView 根据基础行的 RowState 来隐式地管理要公开哪些行版本。例如,如果 RowStateFilter 设置为 DataViewRowState.Deleted,由于不存在 Current 行版本,DataView 将公开所有 Deleted 行的 Original 行版本。可以使用 DataRowView 的 RowVersion 属性来确定要公开行的哪些行版本。
[C#]
DataView prodView = new DataView(prodDS.Tables["Products"],
"UnitsInStock <= ReorderLevel",
"SupplierID, ProductName",
DataViewRowState.CurrentRows);
--------------------------------------------------------------------------
查看 DataView 的内容
DataView 公开可枚举的 DataRowView 对象集合。DataRowView 对象将值公开为 object 数组,这些数组按基础表中列的名称或序号引用来编制索引。可以使用 DataRowView 的 Row 属性来访问由 DataRowView 公开的 DataRow。
当使用 DataRowView 查看值时,DataView 的 RowStateFilter 属性将确定公开基础 DataRow 的哪一个行版本。
[C#]
DataView catView = new DataView(catDS.Tables["Categories"]);
Console.WriteLine("Current Values:");
WriteView(catView);
Console.WriteLine("Original Values:");
catView.RowStateFilter = DataViewRowState.ModifiedOriginal;
WriteView(catView);
public static void WriteView(DataView myView)
{
foreach (DataRowView myDRV in myView)
{
for (int i = 0; i < myView.Table.Columns.Count; i++)
Console.Write(myDRV[i] + "\t");
Console.WriteLine();
}
}
-------------------------------------------------------------------------------------------------------------
使用 DataView 修改数据
可以使用 DataView 在基础表中添加、删除或修改数据行。通过设置 DataView 的三个布尔值属性之一,可以控制使用 DataView 修改基础表数据的能力。这些属性为 AllowNew、AllowEdit 和 AllowDelete。默认情况下,它们设置为 true。
如果 AllowNew 为 true,则可以使用 DataView 的 AddNew 方法来创建新的 DataRowView。请注意,在调用 DataRowView 的 EndEdit 方法之前,新行实际上不会添加到基础 DataTable 中。如果调用 DataRowView 的 CancelEdit 方法,则将丢弃新行。另请注意,一次只能编辑一个 DataRowView。如果在存在挂起行时调用 DataRowView 的 AddNew 或 BeginEdit 方法,则会对该挂起行隐式调用 EndEdit。当调用 EndEdit 时,更改将应用于基础 DataTable,并且随后可以使用 DataTable、DataSet 或 DataRow 对象的 AcceptChanges 或 RejectChanges 方法来提交或拒绝更改。如果 AllowNew 为 false,则当调用 DataRowView 的 AddNew 方法时,将引发异常。
如果 AllowEdit 为 true,可以通过 DataRowView 来修改 DataRow 的内容。您可以使用 DataRowView.EndEdit 确认对基础行的更改,或使用 DataRowView.CancelEdit 拒绝更改。请注意,一次只能编辑一行。如果在存在挂起行时调用 DataRowView 的 AddNew 或 BeginEdit 方法,则将对挂起行隐式调用 EndEdit。当调用 EndEdit 时,建议更改将放置在基础 DataRow 的 Current 行版本中,随后可以使用 DataTable、DataSet 或 DataRow 对象的 AcceptChanges 或 RejectChanges 方法来提交或拒绝这些更改。如果 AllowEdit 为 false,则当试图修改 DataView 中的值时,将引发异常。
当编辑现有 DataRowView 时,仍将引发基础 DataTable 的事件,并提供建议更改。请注意,如果对基础 DataRow 调用 EndEdit 或 CancelEdit,那么无论是否对 DataRowView 调用 EndEdit 或 CancelEdit,都将应用或取消挂起的更改。
如果 AllowDelete 为 true,则可以使用 DataView 或 DataRowView 对象的 Delete 方法删除 DataView 中的行,这些行也将从基础 DataTable 中删除。随后可以分别使用 AcceptChanges 或 RejectChanges 来提交或拒绝删除。如果 AllowDelete 为 false,当调用 DataView 或 DataRowView 的 Delete 方法时,将引发异常。
以下代码示例禁用通过 DataView 删除行的功能,并使用 DataView 向基础表中添加新行。
[C#]
DataTable custTable = custDS.Tables["Customers"];
DataView custView = custTable.DefaultView;
custView.Sort = "CompanyName";
custView.AllowDelete = false;
DataRowView newDRV = custView.AddNew();
newDRV["CustomerID"] = "ABCDE";
newDRV["CompanyName"] = "ABC Products";
newDRV.EndEdit();