分享
 
 
 

VisualBasic.NET实现主/从数据表视图

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

一、简介

在以数据库为中心的应用程序中,主/从数据表视图是一种非常常见的设计模式。在这种模式下,顶级数据(主表)显示在一个用户界面元素中(如Data Grid),而与之相关的细节数据(从表)则根据主表的选择作相应的变化更新。例如:我们可以查看出版社已出版图书的信息列表,当选择某种图书时,在从表中立即显示出该图书的销售情况。

在.net中实现主/从数据表模式一般有两种方式,一是利用一个Data Grid控件装入两个相关的数据表,二是采用两个Data Grid控件实现主从模式。为便于说明,我们采用SQL Server 2000自带的Pubs数据库的Titles表和Sales表进行演示,其中Titles表记录了某出版社的图书目录,而Sales表则是每种图书的销售数据,两张表中都包含title_id列。

二、一个Data Grid中装入多个相关表

我们都知道,将Data Grid的Data Source属性同Dataset相绑定,即可将数据表显示在Data Grid中,但不少初学者并不清楚:通过向Dataset中添加多个Data Table对象,每个Data Table对象装入一张表,再设定好关联,即可在Data Grid中显示多张关联表。

Imports System.Data.SqlClient

’引用SqlClient命名空间

Public Class Form1

Const Connection String As String = "integrated security=sspi;initial catalog=Pubs; data source=(local)"

’定义连接字符串

Private Sub Button1_Click(By Val sender As Object, By Val e As System.EventArgs) Handles Button1.Click

Dim cn As New SqlConnection (Connection String)

Cn. Open()

’建立同数据库的连接

Dim ds As New Dataset("Book Sales")

’创建Dataset对象

Dim Titles Table As New Data Table("Titles")

ds.Tables.Add(Titles Table)

’创建Data Table对象(Titles表),加入Dataset

Dim GetTitlesString As String = "Select * From Titles"

Dim da As New SqlDataAdapter(GetTitlesString, cn)

da.Fill(Titles Table)

’填充Data Table

da.Dispose()

Dim Sales Table As New Data Table("Sales")

ds.Tables.Add(Sales Table)

Dim GetSalesString As String = "Select * From Sales"

da = New SqlDataAdapter(GetSalesString, cn)

da.Fill(Sales Table)

’创建并填充Sales表

da.Dispose()

cn.Close()

Dim relation As New Data Relation("Title Sales", TitlesTable.Columns("title_id"),SalesTable.Columns("title_id"))

ds.Relations.Add(relation)

根据title_id列建立两个表的关联

DataGrid1.DataSource = ds

将DataGrid1绑定到Dataset对象(即ds)

End Sub

End Class

需要注意的是:在单表模式下,用SqlDataAdapter对象填充Dataset时,若发现Dataset中没有表,就自动创建一个新的Data Table并填充;而用主从模式时,应显示创建每个Data Table对象并填充,再利用Data Relation对象建立多个Data Table之间的关联,最后将Data Grid绑定到Dataset上。

(图1:Data Grid中装入两张表)

运行工程,会看到一个有加号按钮的视图。单击加号,窗体中出现装入的所有表名,如图1。如果查看Titles表,就会发现在每行的旁边有一个小加号按钮,点击加号,就可以查看其销售情况,如图2、图3。

(图2:主表情况)

(图3:从表情况)

在窗体的右上部,向左的小箭头按钮用于回退。每查看一次销售情况后,都必须用回退按钮回到主表,显然,这种主/从表模式的可操作性很差,也不太符合我们的操作习惯。也许,后一种方式是比较好的解决方案。

三、用两个Data Grid实现主/从数据表

更有效的解决方案是使用两个Data Grid控件,主、从表均可见。对主表上某行进行选择,会立即引发从表内容的改变。

建立工程,添加一个Panel控件,将其Dock属性设置为Top;添加一个Splitter控件,Dock属性同样设置为Top;在窗体下部再添加一个Panel,Dock属性为top。然后,在两面板中各添加一个Data Grid,其Dock属性为Fill。窗体布局如图4。

(图4:窗体布局)

要实现DataGrid2的内容动态更新,需要对DataGrid1的CurrentCellChanged事件进行监听,在接受到DataGrid1的变化消息后,加载相应的数据。

Imports System.Data.SqlClient

Public Class Form1

Const Connection String As String = "integrated security=sspi;initial catalog=pubs; data source=(local)"

Private Sub Button1_Click(By Val sender As Object, By Val e As System.EventArgs) Handles Button1.Click

Dim cn As New SqlConnection(Connection String)

cn.Open()

Dim ds As New Dataset

Dim GetTitlesString As String = "Select * From Titles"

Dim Titles Table As New Data Table("Titles")

ds.Tables.Add(Titles Table)

Dim da As New SqlDataAdapter(GetTitlesString, cn)

da.Fill(Titles Table)

da.Dispose()

cn.Close()

DataGrid1.DataSource = Titles Table

’主表显示在DataGrid1中

End Sub

Private Sub DataGrid1_CurrentCellChanged(By Val sender As Object, By Val e As System.EventArgs) Handles DataGrid1.CurrentCellChanged

Dim titled As String = DataGrid1.Item(DataGrid1.CurrentCell.RowNumber, 0).To String

’判断用户在主表中选择了哪一行,取出它的第0列(在本例中即为title_id列)

Dim sql As String = "select * from sales where title_id=’" & titled & "’"

’SQL命令字符串,选择与主表中相同title_id值的从表数据

Dim cn As New SqlConnection(Connection String)

cn.Open()

Dim ds As New Dataset

Dim da As New SqlDataAdapter(sql, cn)

Dim Sales Table As New Data Table("Sales")

ds.Tables.Add(Sales Table)

da.Fill(Sales Table)

’用选择的从表数据填充,更新

da.Dispose()

cn.Close()

DataGrid2.DataSource = Sales Table

End Sub

End Class

运行程序,在主表中选择某行,从表就会显示出匹配的销售信息,如图5。

(图5:主从数据表同时显示)

四、结束语

利用主/从数据表模式,能在较小的编程工作量下,实现很好的显示及操作效果。若要建立多表关联的主/从视图,或是进行增、删、改等操作,在此方法上进行改进即可。希望本文能给读者在数据库编程时带来一定的启示和帮助。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有