程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> ADO.NET 2.0:如何建立一個 DataView

ADO.NET 2.0:如何建立一個 DataView

編輯:關於.NET

借助於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控件只會顯 示出目前薪資大於49000元的員工數據,並且數據會依照目前薪資由高至低排列 :

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved