欲通过 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 参数的设定方式相同,于此不再赘述。  
程序范例  

上图所示的程序能够在执行阶段动态设定 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