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

 

借助于DataView,我便能够为储存于DataTable中的据建立不同的视图。比方,通DataView可以使用不同的排序检视DataTable中的据,亦或是根据据列状态筛选来筛选DataTable中的料。重要的是,需要替DataTable中的据建立不同的视图而且需要将这定到窗体上的控件,更需要使用DataView完成。 

 

DataView提供的是一动态视图,也就是,其容、排序序、员会DataTable中的任何更。DataViewDataTable.Select方法有很大的不同,Select方法根据特定的筛选式或排序从数据表中回一DataRow数组,而且其成员与排序序是静态的。正由于DataView动态特性,因此非常适合用于用程序。 

 

DataView提供您单据集合的动态视图可以对数据集合套用不同的排序序和筛选条件,此点SQL Server所提供的视图View)有点似。然而,DataView与数库视图仍然有相大的差,因DataView无法据表使用,也无法提供连结数据表的视图。此外,不能排除据表中的字段,也不能外加入据表中不存在的字段(例如:表式字段)。 

 

可以采用两种方式建立一DataView。第一方式是使用DataView函式,第二方式是建立DataTableDefaultView性的一个参考。本文将详细如何使用这两种方式建立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,然后才能继续设定其它属性(RowFilterSort…等等)。 

 

以下的程序代示范如何使用第一版本的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建构函式的第三个版本表示使用指定的DataTableRowFilterSortDataViewRowState,来初始化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被建立时,以及当SortRowFilterRowStateFilter属性有任何一个被修改时,都会重新建立DataView的索引。此意味着,如果您希望享有最佳的效能,应该在建立DataView时,直接于建构函式中指定排序顺序或筛选条件。如果您于建立DataView时并未直接于建构函式中指定排序顺序或筛选条件,而是于建立DataView对象之后再设定其SortRowFilterRowStateFilter属性,将会导致DataView的索引被重新建立,而使得索引至少被建立两次。 

 

使用DataTableDefaultView属性

 

DataTableDefaultView属性会传回一个以此DataTable作为来源数据表的DataView对象,您便让您去排序、筛选、与搜寻DataTable中的数据列。如果您所建立的DataView要显示出DataTable中的所有数据列并依照自然顺序来排列,则使用DataTableDefaultView属性来建立DataView将是非常直接且便利的方式。 

 

以执行画面如图表1所示的程序而言,它使用DataTableDefaultView属性来建立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

章立民研究室敬上

期待更多精彩,敬请关注:

http://www.china-pub.com/static/jsj_zlm_060824.html

 

posted on 2006-10-23 18:06  章立民研究室  阅读(4398)  评论(3编辑  收藏  举报

导航