借助於DataView,我們便能夠為儲存於DataTable中的資料建立不同的視圖。比方說,透過DataView,您可以使用不同的排序順序檢視DataTable中的數據,亦或是根據資料列狀態或篩選表達式來篩選DataTable中的資料。重要的是,當我們需要替DataTable中的資料建立不同的視圖而且需要將這些資料綁定到窗體上的控制項時,更需要使用DataView來完成。
DataView提供的是一種動態的資料視圖,也就是說,其內容、排序順序、與成員會反應出來源DataTable中的任何變更。顯然DataView與DataTable.Select方法有很大的不同,Select方法會根據特定的篩選表達式或排序順序從資料表中傳回一個DataRow物件數組,而且其成員與排序順序是靜態不變的。正由於DataView的動態反應特性,因此非常適合用於資料綁定應用程式。
DataView提供您單一資料集合的動態視圖,您可以對資料集合套用不同的排序順序和篩選條件,此點與SQL Server資料庫所提供的視圖(View)有點類似。然而,DataView與資料庫視圖仍有相當大的差異,因為DataView無法當成資料表來使用,也無法提供連結資料表的視圖。此外,您不僅不能排除來源資料表中的字段,也不能額外加入來源資料表中不存在的字段(例如:表達式字段)。
您可以採用兩種方式來建立一個DataView。第一種方式是使用DataView建構函式,第二種方式則是建立DataTable之DefaultView屬性的一個參考。本文將詳細探討如何使用這兩種方式來建立DataView。
使用DataView建構函數
DataView建構函數共提供下表所示的三個多載版本。
DataView建構函數的多載版本
DataView()
DataView(ByVal table As DataTable)
DataView(ByVal table As DataTable, _
ByVal RowFilter As String, _
ByVal Sort As String, _
ByVal RowState As DataViewRowState)
DataView建構函式的第一個版本表示不使用任何參數來初始化DataView類別的新執行個體。請注意,如果您採用此版本來建立DataView,必須在建立DataView物件後先設定Table屬性以便決定其來源DataTable,然後才能繼續設定其它屬性(RowFilter、Sort…等等)。
以下的程式碼示範如何使用第一個版本的DataView建構函式來建立DataView對象,以便篩選和排序資料集內之「章立民工作室」資料表的資料列,並將DataGridView控制項綁定至此DataView。我們發現,DataGrid控制只會顯示出女性,且資料會依姓名的筆畫順序由多至少排列。以下是本範例的程式碼:
SqlDataAdapter1.Fill(Ds章立民工作室, "章立民工作室")
' 建立DataView 對象
Dim dv As DataView = New DataView
' 由於採用沒有任何參數的DataView 建構函式來建立DataView 對象,
' 因此必須先設定Table 屬性以便決定其來源DataTable
dv.Table = Ds章立民工作室.章立民工作室
' 設定排序順序以便依姓名的筆畫順序由多至少排列
dv.Sort = "姓名DESC"
' 設定篩選條件以便只顯示出女性
dv.RowFilter = "性別= '女'"
' 將DataGridView 控制項綁定至DataView
DataGridView1.DataSource = dv
DataView建構函式的第二個版本表示使用指定的DataTable來初始化DataView 類別的新執行個體。
以下的程式碼它示範如何使用第二個版本的DataView建構函數來建立DataView對象,以便篩選和排序資料集內之「章立民工作室」資料表的資料列,並將DataGridView控制項綁定至此DataView 。我們發現,DataGridView控制項只會顯示出「資訊部」的員工數據,而數據會依照目前薪資由高至低排列:
SqlDataAdapter1.Fill(Ds章立民工作室, "章立民工作室")
' 建立DataView 對象
Dim dv As DataView = New DataView(Ds章立民工作室.章立民工作室)
' 設定排序順序以便依目前薪資由高至低排列
dv.Sort = "目前薪資DESC"
' 設定篩選條件以便只顯示出「資訊部」的員工數據
dv.RowFilter = "部門= '資訊部'"
' 將DataGridView 控制項綁定至DataView
Me.DataGridView1.DataSource = dv
DataView建構函式的第三個版本表示使用指定的DataTable、RowFilter、Sort和DataViewRowState,來初始化DataView類別的新執行個體。
以下的程式碼它示範如何使用第三個版本的DataView建構函數來建立DataView對象,以便篩選和排序資料集內之「章立民工作室」資料表的資料列,並將DataGridView控制項綁定至此DataView 。我們發現,DataGridView控制項只會顯示出目前薪資大於49,000元的員工數據,且數據會依照目前薪資由高至低排列:
SqlDataAdapter1.Fill(Ds章立民工作室, "章立民工作室")
' 建立DataView 對象
Dim dv As DataView = New DataView( _
Ds章立民工作室.章立民工作室, _
"目前薪資> 49000", _
"目前薪資DESC", _
DataViewRowState.CurrentRows)
' 將DataGridView 控制項綁定至DataView
Me.DataGridView1.DataSource = dv
在此要特別提醒大家,當DataView被建立時,以及當Sort、RowFilter或RowStateFilter屬性有任何一個被修改時,都會重新建立DataView的索引。此表示,如果您希望享有最佳的效能,應該在建立DataView時,直接於建構函式中指定排序順序或篩選條件。如果您在建立DataView時並未直接於建構函式中指定排序順序或篩選條件,而是在建立DataView物件之後再設定其Sort、RowFilter或RowStateFilter屬性,將會導致DataView的索引被重新建立,而使得索引至少建立兩次。
使用DataTable的DefaultView屬性
DataTable的DefaultView屬性會傳回一個以此DataTable作為來源資料表的DataView對象,您便讓您去排序、篩選、與搜尋DataTable中的資料列。如果您所建立的DataView要顯示DataTable中的所有資料列並依照自然順序排列,則使用DataTable的DefaultView屬性來建立DataView將會是一種非常直接且便利的方式。
以執行畫面如圖表1所示的程式而言,它使用DataTable的DefaultView屬性來建立DataView,以便一開始能夠於DataGrid控制項中顯示來源資料表的所有資料列,並讓使用者在執行階段透過DataView來動態篩選資料。茲將程式碼列示如下:
' DataView 物件的類別層級宣告
Private dv As DataView
Private Sub DemoForm5_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
FillComboBoxDepartment()
SqlDataAdapter1.Fill(Ds章立民工作室, "章立民工作室")
' 建立DataView
dv = Ds章立民工作室.章立民工作室.DefaultView
' 顯示DataView 中的資料列數目
txtRowCount.Text = dv.Count.ToString
' 將DataGridView 控制項綁定至DataView
Me.DataGridView1.DataSource = dv
End Sub
Private Sub FillComboBoxDepartment()
' 建立資料命令物件(亦即SqlCommand 物件)
Dim foxCMD As New SqlCommand
foxCMD.Connection = SqlConnection1
foxCMD.CommandText = "SELECT DISTINCT 部門FROM dbo.章立民工作室"
' 開啟連接
SqlConnection1.Open()
Using myReader As SqlDataReader = foxCMD.ExecuteReader()
If myReader.HasRows Then
While myReader.Read()
ComboBoxDepartment.Items.Add(myReader.GetSqlString(0))
End While
End If
End Using
ComboBoxDepartment.SelectedIndex = 0
End Sub
Private Sub btnFilter_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnFilter.Click
dv.RowFilter = "部門= '" & _
ComboBoxDepartment.SelectedItem.ToString() & "'"
' 顯示DataView 中的資料列數目
txtRowCount.Text = dv.Count.ToString
End Sub
http://www.cnblogs.com/liminzhang/archive/2006/10/23/537518.html