欲通过
DataView
来筛选
DataTable
中的数据,请采用下列方式:
<?xml:namespace prefix = o />
Ø
使用第三个多载版本的
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
参数的设定方式相同,于此不再赘述。
<?xml:namespace prefix = v />
程序范例
上图所示的程序能够在执行阶段动态设定
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
' 汇入命名空间
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
转载于:https://blog.51cto.com/hndtraveller/173429