ADO.NET 2.0 - 如何使用 DataView 來篩選資料

摘要:ADO.NET 2.0 - 如何使用 DataView 來篩選資料

欲透過 DataView 來篩選 DataTable 中的資料,請採用下列方式:

 

q  使用第三個多載版本之 DataView 建構函式來建立 DataView 物件的時候,即可使用 RowFilter 參數來設定篩選資料的運算式。此一運算式的設定方式與 DataColumn之Expression 屬性的設定方式相同,相關說明,請參閱「Visual Basic 2005檔案IO與資料存取秘訣」一書的第五章。

q  您也可以在建立 DataView 物件之後再設定其 RowFilter 屬性以便決掉要如何篩選資料。RowFilter 屬性的設定方式與 DataColumn 之 Expression 屬性的設定方式相同,相關說明,請參閱「Visual Basic 2005檔案IO與資料存取秘訣」一書的第五章。

q  當您使用第三個多載版本之 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資料列版本。

 

q  您也可以在建立 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