借助于
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
本文出自 “章立民” 博客,转载请与作者联系!