ADO.NET 2.0 - 如何建立一个 DataView

借助于 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

本文出自 “章立民” 博客,转载请与作者联系!

你可能感兴趣的:(职场,休闲,ADO.NET,DATAVIEW)