分享
 
 
 

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

王朝c#·作者佚名  2008-05-30
窄屏简体版  字體: |||超大  

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

http://www.cnblogs.com/liminzhang/archive/2006/10/23/537518.html

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有