ADO.NET 2.0 - 如何使用 DataView 来筛选数据
欲通过 DataView 来筛选 DataTable 中的数据,请采用下列方式:
Ø 使用第三个多载版本的 DataView 建构函式来建立 DataView 对象的时候,即可使用 RowFilter 参数来设定筛选数据的表达式。此一表达式的设定方式与 DataColumn之Expression 属性的设定方式相同,相关说明,请参阅「Visual Basic 2005档案IO与数据存取秘诀」一书的第五章。
Ø 您也可以在建立 DataView 对象之后再设定其 RowFilter 属性以便定要如何筛选数据。RowFilter 属性的设定方式与 DataColumn 的Expression 属性的设定方式相同,相关说明,请参阅「Visual Basic 2005档案IO与数据存取秘诀」一书的第五章。
Ø 当您使用第三个多载版本之 DataView 建构函式来建立 DataView 对象的时候,即可使用 RowState 参数来设定数据列状态的筛选条件。比方说,如果您将 RowState 参数设定成 DataViewRowState.Deleted,则 DataView 会公开所有 Deleted 数据列的 Original 数据列版本,原因是没有 Current 数据列版本。您可以使用 DataRowView 的 RowVersion 属性,来判断公开的数据列版本为何。
RowState 参数的类别是列举类别 DataViewRowState,下表列出 DataViewRowState 的所有成员与说明。
DataViewRowState |
说明 |
CurrentRows |
所有Unchanged、Added和Modified数据列的Current数据列版本。此为默认值。 |
Added |
所有Added数据列的Current数据列版本。 |
Deleted |
所有Deleted数据列的Original数据列版本。 |
ModifiedCurrent |
所有Modified数据列的Current数据列版本。 |
ModifiedOriginal |
所有Modified数据列的Original数据列版本。 |
None |
无资料列。 |
OriginalRows |
所有Unchanged、Modified和Deleted数据列的Original数据列版本。 |
Unchanged |
所有Unchanged数据列的Current数据列版本。 |
Ø 您也可以在建立 DataView 对象之后再设定其 RowStateFilter 属性以便决定要如何筛选数据列版本。RowStateFilter 属性的设定方式与 RowState 参数的设定方式相同,于此不再赘述。
程序范例
上图所示的程序能够在执行阶段动态设定 DataView 的 RowFilter 属性,以便让使用者能够通过一或两个字段来动态筛选数据。兹将程序代码完整列示如下:
Option Strict On
' 汇入命名空间
Imports System.Data.SqlClient
Public Class Form1
Private ds As New DataSet
Private dv As DataView
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
' 利用 SqlConnectionStringBuilder 对象来构建连接字符串。
Dim connectStringBuilder As New SqlConnectionStringBuilder()
connectStringBuilder.DataSource = "(local)SQLEXPRESS"
connectStringBuilder.InitialCatalog = "北风贸易"
connectStringBuilder.IntegratedSecurity = True
Try
Using cn As New SqlConnection(connectStringBuilder.ConnectionString)
cn.Open()
Dim cmdLiming As New SqlCommand( _
"SELECT 部门, 性别, 员工编号, 身份证字号, 姓名, " & _
"地址, 邮政编码, 出生日期, 婚姻状况, 雇用日期, " & _
"起薪, 目前薪资, 加薪日期FROM dbo.章立民工作室;" & _
"SELECT DISTINCT 部门FROM dbo.章立民工作室;", cn)
Using drLiming As SqlDataReader = cmdLiming.ExecuteReader()
ds.Load(drLiming, LoadOption.OverwriteChanges, _
New String() {"章立民工作室", "部门"})
' 将 BindingSource 组件系结至 DataSet 当中
' 的「章立民工作室」资料表。
Me.BindingSource1.DataSource = ds.Tables("章立民工作室")
' 将 DataGridView 控件系结至 BindingSource 组件。
Me.DataGridView1.DataSource = Me.BindingSource1
End Using
End Using
' 建立 DataView 对象
dv = ds.Tables("章立民工作室").DefaultView
' 显示 DataView 中的数据列数目
txtRowCount.Text = dv.Count.ToString
' 替选择部门的下拉式清单方块加入选项
For i As Integer = 0 To ds.Tables("部门").Rows.Count – 1
ComboBoxDepartment.Items.Add(ds.Tables("部门").Rows(i)(0))
Next
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Private Sub btnFilter_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnFilter.Click
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
dv.RowFilter = RowFilterExpr
' 显示 DataView 中的数据列数目
txtRowCount.Text = dv.Count.ToString
End Sub
End Class
章立民研究室敬上
期待更多精彩,敬请关注:
http://www.china-pub.com/static/jsj_zlm_060824.html