摘要: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