DataView控件的使用技巧

时间:2022-08-22 06:31:02

摘要:在提供的数据访问控件中,DataView具有功能强大的数据处理功能。本文就DataView的数据排序、数据筛选、数据搜索、数据修改等功能实现技巧进行探讨。

关键词:;数据源;DataView控件

中图法分类号:TP311 文献标识码:A 文章编号:1009-3044(2008)08-10ppp-0c

1 前言

随着计算机功能不断增强,计算机领域不断扩大,在计算机上运行的应用软件功能也在增强、复杂化。为了完成庞大的计算机软件功能,计算机软件开发和应用中不得不涉及到数据库处理技术。在软件开发和应用中,经常需要对数据库中数据进行频繁访问和处理。在访问大型数据库时,怎样才能得到有效的数据,并能对数据进行有效处理,提高程序效率?在.NET平台下的数据处理控件中,能充分使用DataView控件对数据处理技巧,将在软件开发中,大大提高数据处理功能,从而提高程序效率。

2 DataView的使用技巧

2.1 数据排序功能

在.NET中实现组件数据绑定时,常常需要对数据进行排序。如果数据源使用是DataView控件,则可很容易实现对数据进行排序。

通过DataView控件来排序数据源中的数据,常有方法有:

2.1.1 用DataView对象的Sort属性排序

可在建立DataView对象之后,再配置其Sort属性以便决定要如何排序数据。Sort属性的配置方式与Sort参数的配置方式完全相同。

如图1,下面主要代码示范如何在执行阶段动态配置DataView的Sort属性,以便让用户能够通过一或两个字段来动态排序数据。

Dim SortExpr As String

If ComboBoxSortColumn1.SelectedIndex > -1 Then

SortExpr = ComboBoxSortColumn1.SelectedItem.ToString& _

IIf(RadioButton1.Checked, " ASC", " DESC")

If ComboBoxSortColumn2.SelectedIndex > -1 Then

SortExpr &= ", " & ComboBoxSortColumn2.SelectedItem.ToString &_ IIf(RadioButton3.Checked, " ASC", " DESC")

End If

DataView1.Sort = SortExpr

Else

MessageBox.Show("您至少必须选择排序的第一个字段")

End If

图1 DataView对象的Sort属性排序

2.1.2 用DataView对象的Sort参数排序

可使用DataView对象的Sort参数来决定要根据一个或多个字段来排序数据。可以在字段名称之后加上关键词ASC(升序)或DESC(降序),以便决定要根据此字段是递增还是递减排序,默认为递增排序。如果要根据多个字段排序数据,请在各字段使用逗号(,)来加以分隔。

2.1.3 用DataView对象的ApplyDefaultSort属性排序

可以配置DataView对象的ApplyDefaultSort属性,以便决定是否根据主键来排序数据。当将ApplyDefaultSort属性设为True,表示要根据主键来排序数据;当 ApplyDefaultSort属性设为False(此为默认值),表示不根据主键来排序数据。

注意:只有在Sort属性为Null引用或空字符串,以及当表定义主键时,才会套用ApplyDefaultSort属性的配置。

2.2 数据筛选功能

在.NET中实现组件数据绑定时,有时只需要绑定的部分数据。如果数据源使用是DataView控件,则可很容易实现对数据进行筛选。

2.2.1 用DataView对象的RowFilter参数筛选

可使用DataView对象的RowFilter参数来设定筛选数据的表达式。由于表达式内容比较复杂,请查阅相关资料,这里不再阐述。

2.2.2 用DataView对象的RowFilter属性筛选

可在建立DataView对象之后再配置其RowFilter属性以便决定要如何筛选数据。RowFilter属性的配置方式与RowFilter参数的表达式配置方式完全相同。

如图2,下面主要代码示范如何在执行阶段动态配置DataView的RowFilter属性,以便让用户能够通过一或两个字段来动态筛选数据。

Dim RowFilterExpr As String = ""

If ComboBoxDepartment.SelectedIndex > -1 Then

RowFilterExpr = "部门 = '" & ComboBoxDepartment.SelectedItem.ToString() & "'"

End If

If ComboBoxGender.SelectedIndex > -1 Then

If RowFilterExpr "" Then

RowFilterExpr &= " AND "

End If

RowFilterExpr &= "性别 = '" & ComboBoxGender.SelectedItem.ToString() & "'"

End If

If RowFilterExpr = "" Then

MessageBox.Show("您没有设定任何筛选条件")

Exit Sub

End If

DataView1.RowFilter = RowFilterExpr

txtRowCount.Text = DataView1.Count.ToString

图2 DataView对象的RowFilter属性筛选

2.2.3 用DataView对象的RowState参数来筛选

在建立DataView对象时,可使用RowState参数来设定记录状态的筛选条件。RowState参数的类型是列举类型DataViewRowState,如表1,列出了DataViewRowState的所有成员。

表1DataViewRowState的枚举值

例如:如果将RowState参数设为DataViewRowState.Deleted,则DataView会公开所有Deleted记录的Original记录版本,因为没有Current记录版本。可以使用DataRowView的RowVersion属性,来判断公开的记录版本为何。

2.2.4 用DataView对象的RowStateFilter属性来筛选

可以在建立DataView对象之后,再配置其RowStateFilter属性以便决定要如何筛选记录版本。RowStateFilter属性的配置方式与RowState参数的配置方式相同。

2.3 数据搜索功能

2.3.1 使用DataView的Find方法来搜索记录

Find方法提供表2所示的两个重载版本。

表2 Find方法的重载版本

Find方法使用记录的排序键值来搜索记录,那么,在调用Find方法之前,务必先将ApplyDefaultSort属性设定为True或是利用Sort属性来设定排序顺序,否则将会抛出异常。例如,如果搜索“姓名”字段为“章立民”的记录,必须使用“姓名”字段来排序数据,然后才能调用Find方法进行搜索,代码写法如下:

DataView1.Sort=”姓名”

Dim rowIndex AS Integer=DataView1.Find(“章立民”)

If rowIndex=-1 Then

MessageBox.Show(“找不到您所搜索的姓名”)

Else

MessageBox.Show(DataView1(rowIndex)(“姓名”) & DataView1(rowIndex)(“当前工资”).ToString())

End If

以上的代码中,Find方法会返回所搜索到记录的索引。如果有多条记录符合搜索条件,则只会返回第一条符合搜索条件的记录的索引。如果找不到任何符合条件的记录,则Find方法会返回-1。

Find方法在搜索数据值时,会根据源DataTable的CaseSensitive属性来决定是否考虑大小写。搜索值必须完全符合现有的排序索引键值,才能返回结果。

注意:如果使用单一字段来排序数据,请使用第一个版本的Find方法来搜索排序键值,并将单一值传递给它。然而,如果使用多个字段来排序数据,请使用第二个版本的Find方法来搜索排序键值,并将一个对象数组传递给它,而且对象数组中各个数据值的顺序必须与DataView的 Sort属性中所指定的字段顺序相符。例如:假设要搜索“行销部”中姓名为“章立民”的员工数据,可以写代码:

DataView1.Sort=”部门,姓名”

Dim TargetValues(1) As Object

TargetValues(0)=”行销部”

TargetValues(1)=”章立民”

Dim rowIndex As Integer=DataView1.Find(TargetValues)

If rowIndex=-1 Then

MessageBox.Show(“找不到您所搜索的部门与姓名”)

Else

MessageBox.Show(DataView1(rowIndex(“姓名”) & “的薪资是:” & DataView1(rowIndex)(“当前工资”).ToString())

End If

2.3.2 使用DataView的FindRows方法来搜索记录

FindRows方法提供表3所示的两个重载版本。

表3 FindRows方法的重载版本

FindRows方法的使用与 Find方法基本一样,唯一的差异是:FindRows方法的返回值不是一个整数,而是其字段符合指定排序索引键值的DataRowView对象数组。如果没有任何记录包含指定的排序索引键值,则FindRows方法将返回空的DataRowView数组。

2.4 数据修改功能

使用DataView控件可以对绑定的数据源表中的记录进行新建、修改和删除。但是,如果用DataView来新建、修改和删除源表中的记录,必须将DataView的属性AllowNew、AllowEdit和AllowDelete属性设为True(这三个属性默认值都是True)。

2.4.1 使用DataView新建记录

将DataView的AllowNew属性设定为True,便可以使用DataView的AddNew方法来建立新的DataRowView。

注意:

①要等到DataRowView的EndEdit方法被调用时,新记录才会确实被添加到源表中。如果调用DataRowView的CancelEdit方法,则新记录将会被舍弃。

②一次只能编辑一个DataRowView。如果当一个未决的记录存在时,调用了DataRowView的AddNew或BeginEdit方法,则未决的记录便会隐含调用EndEdit方法。EndEdit方法被调用后,变更就会套用到源表,不过稍后可以调用DataSet、DataTable或DataRow对象的AcceptChanges或RejectChanges方法来提交或拒绝变更。如果AllowNew属性的设定值为False,则当调用DataRowView的AddNew方法时将会抛出异常。

以下的程序代码示范如何使用DataView来新建记录到源表:(设custDS为数据集名,绑定有数据表“章立民工作室”。)

Dim StudioTable As DataTable=custDS.Tables(“章立民工作室”)

Dim StudioView As DataView=StudioTable.DefaultView

StudioView.Sort=”姓名”

StudioView.AllowDelete=False

Dim newDRV As DataRowView=StudioView.AddNew()

newDRV(“身份证号码”)=”M000111222”

newDRV(“姓名”)=”周时恕”

newDRV.EndEdit ()

2.4.2 使用DataView修改记录

将DataView的AllowEdit属性设定为True,则可以通过DataRowView来修改DataRow的内容。可以调用DataRowView.EndEdit方法来确认源记录的变更,或是调用DataRowView.CancelEdit方法来拒绝变更。

注意:

①一次只能编辑一个记录。如果当一个未决的记录存在时,调用了DataRowView的AddNew或BeginEdit方法,则未决的记录便会隐含调用EndEdit方法。EndEdit方法被调用后,建议的变更就会套用到源DataRow的Current记录版本,不过稍后可以调用DataSet、DataTable或DataRow对象的AcceptChanges或RejectChanges方法来提交或拒绝变更。如果AllowEdit属性的设定值为False,则当调用DataRowView的AddEdit方法时将会抛出异常。

②当一个现有的DataRowView正被编辑时,源表的事件仍会与建议的变更一起被引发。如果调用源DataRow的EndEdit或CancelEdit,则不管DataRowView上是否有调用EndEdit或CancelEdit,未决的变更仍会被套用或取消。

2.4.3 使用DataView删除记录

将DataView的AllowDelete属性设定为True,则可以通过DataView或DataRowView对象的Delete方法,从DataView中删除记录。稍后可以调用AcceptChanges方法来提交删除,或是调用RejectChanges方法来拒绝删除。DataView的Delete方法会删除指定索引处的记录,其语法如下所示:

Delete (Byval index As Integer)

如果AllowDelete属性的设定为False,则当调用DataView或DataRowView的Delete方法时将会抛出异常。

3 结束语

上述技巧在.NET的数据绑定中往往进行综合运用,大大增强了.NET的数据处理功能,从而增强软件的数据处理能力。正确灵活地运用DataView的这些技巧,将为应用软件的开发有很大的帮助。

参考文献:

[1]何明国,等.Visual 程序设计――详解.中国水利水电出版社,2004.6.

[2]章立民+数据库应用开发指南.中国铁道出版社,2004,9.

[3]杨浩(译),C#数据库入经典.清华大学出版社,2006.4.

上一篇:SVM算法及其在多类字母图象识别中的应用 下一篇:安全事件管理器――一种新的网络安全防护技术