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

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

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

 

q  使用第三個多載版本之 DataView 建構函式來建立 DataView 物件的時候,即可使用 RowFilter 參數來設定篩選資料的運算式。此一運算式的設定方式與 DataColumnExpression 屬性的設定方式相同,相關說明,請參閱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

所有UnchangedAddedModified資料列的Current資料列版本。此為預設值。

Added

所有Added資料列的Current資料列版本。

Deleted

所有Deleted資料列的Original資料列版本。

ModifiedCurrent

所有Modified資料列的Current資料列版本。

ModifiedOriginal

所有Modified資料列的Original資料列版本。

None

無資料列。

OriginalRows

所有UnchangedModifiedDeleted資料列的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