VB.net数据库编程中DataGrid控件的使用技巧

VB.net数据库编程中DataGrid控件的使用技巧

 

如何用同一个DataGrid显示不同的数据表;如何用DataGrid显示主表/明细表的内容;如何用DataGrid分页显示或编辑数据表的记录。这些技巧在开发数据库程序中很实用。

DataGrid是VB.NET中重要的数据感知控件,它不仅可以把数据库的记录以表格形式显示出来,而且可以表格形式编辑数据库的记录,所以,它在数据库编程中应用非常广泛。那么,在VB.NET数据库编程中DataGrid控件有哪些使用技巧呢?这就是我今天要谈的内容。

1、用同一个DataGrid分别显示不同的数据表

通过动态指定DataGrid的数据源就可以把一个(或多个)数据库中的多个数据表按需要显示在DataGrid中。

在图1、图2中所显示的就是这种情况。在这个实例中,使用的是student.mdb数据库,该数据库中的三个表分别是T_Stu(学生表)、T_Course(课程表)、T_Mark(成绩表)。由于有三个数据表,所以要在窗体上添加三个数据适配器,我们把这分别命名为daStu、daCourse、daMark,每个数据适配器可以连接到数据库中的一个数据,然后生成一个数据集(这  图1   里命名为 ds),数据集中有上述三个数据表。


接着就要编写代码来实现程序的功能。程序代码如下图


把上面程序中的 daCourse.Fill(ds, "T_Course")和 DataGrid1.DataMember = "T_Course"分别修改为daCourse.Fill(ds, "T_Course")和DataGrid1.SetDataBinding(ds, "T_Course")其功能是一样的。

实际上,我们还可以直接利用DataGrid控件显示多个数据表的功能来达到我们的要求。程序代码如下图


单击“加载”命令程序运行结果如下图2


二、用DataGrid显示主表/明细表的内容

左下图所示为程序运行结果的主从表内容。这二个表中有一个字段是相同的。这种情况下,当你在第一个DataGrid中单击任何一条记录,则在下面的第二个DataGrid中显示其对应的详细情况。



在这里,我们使用的数据表是MSSQL Server 2008中的northwind数据库中的orders和orderdetails。由于有二个数据表,所以使用了二个数据适配器daorders和daorderdetails。当数据集生成之后,请在数据上展开“+”会显示orderdetails表。这里要注意要,一定要建立二表的关系;用代码建,代码如下

   ds.Relations.Add("order_details",ds.Tables("orders").Columns("orderid"), ds.Tables("orderdetails").Columns("orderid"))

ds.relations.add(参数一,参数二,参数三)

参数一为自定义的关系明,参数二为数据集中主表的主键的列,参数三为明细表参照主表的外键列。程序代码如下:


三、分页显示或编辑数据表的记录。

用VB.NET程序还可以控制DataGrid分页浏览或编辑数据库记录。这是一个非常实用的功能。不过我们首先要明白,Windows窗体中的DataGrid控件本身不具有分页显示的功能,但我们可以控制它在一个页面中显示记录的条数,从而实现分页显示或编辑功能。

程序运行界面如下图。


要实现这个功能最关键的是要掌握数据适配器的Fill方法的用法,其基本用法是:

数据适配器.Fill(数据集,开始记录,要显示的记录条数,数据表)。

“开始记录”是从0开始显示数据表customers的前5条记录,则可以用下面的程序实现:

程序功能代码如下:

Imports System.Data.SqlClient

Imports System.Data

Public Class Form1

    Dim con As New SqlConnection("datasource=localhost;initial catalog=northwind;user id=sa;password=123")

    Dim da As New SqlDataAdapter("select* from customers", con)

    Dim ds As New DataSet()

    DimcurrentIndex As Integer'当前页首条记录的序列数,第一页从0开始

    Public Const pageSize As Integer = 5 '每页显示的记录数

    Dim w As Integer '总页数

 

    Private Sub dsFill()

        ds.Clear()

        da.Fill(ds, currentIndex, pageSize, "customers")

        DataGrid1.DataMember = "customers"

    End Sub

    Private Sub Form1_Load(sender AsObject, e AsSystem.EventArgs) HandlesMe.Load

        currentIndex = 0

 

        Dim n As Integer '总记录数

        con.Open()

        ds.Clear()

        DataGrid1.DataSource = ds

        da.Fill(ds, "customers")

        DataGrid1.DataMember = "customers"

        n = ds.Tables(0).Rows.Count

        If(Int((n) / pageSize)) = n / pageSize Then '如果整除

            w = Int(n / pageSize)

        Else

            w = Int(n / pageSize) + 1

        End If

        Label1.Text = "请输入页码,页码数大于1小于" & w

        btnBefor.Enabled = False

        dsFill()

        con.Close()

 

    End Sub

 

 

 

    Private Sub btnNext_Click(sender AsSystem.Object, e AsSystem.EventArgs) HandlesbtnNext.Click

        btnBefor.Enabled = True

        btnFirst.Enabled = True

        IfcurrentIndex < (w - 1) * pageSize Then

            currentIndex = currentIndex +pageSize

            btnLast.Enabled = True

        Else

            currentIndex = (w - 1) * pageSize

            btnLast.Enabled = False

            btnNext.Enabled = False

        End If

        dsFill()

    End Sub

 

    Private Sub btnBefor_Click(sender AsSystem.Object, e AsSystem.EventArgs) HandlesbtnBefor.Click

        btnBefor.Enabled = True

        btnLast.Enabled = True

        IfcurrentIndex = 0 Then

            btnBefor.Enabled = False

        Else

            currentIndex = currentIndex -pageSize

        End If

        dsFill()

    End Sub

 

    Private Sub btnShow_Click(sender AsSystem.Object, e AsSystem.EventArgs) HandlesbtnShow.Click

        Dim x As Integer '定义用户在文本框中输入的页码

        x = Val(TextBox1.Text)

        If x>= 1 And x <= w Then

            currentIndex = (x - 1) * pageSize

            dsFill()

        Else

            MsgBox("你输入的页码必须在1" & w & "之间")

        End If

    End Sub

 

    Private Sub btnFirst_Click(sender AsSystem.Object, e AsSystem.EventArgs) HandlesbtnFirst.Click

        currentIndex = 0

        btnBefor.Enabled = False

        btnFirst.Enabled = False

        btnLast.Enabled = True

        btnNext.Enabled = True

        dsFill()

 

    End Sub

 

    Private Sub btnLast_Click(sender AsSystem.Object, e AsSystem.EventArgs) HandlesbtnLast.Click

        currentIndex = (w - 1) * pageSize

        btnLast.Enabled = False

        btnNext.Enabled = False

        btnFirst.Enabled = True

        btnBefor.Enabled = True

        dsFill()

    End Sub

 

    Private Sub btnQuit_Click(sender AsSystem.Object, e AsSystem.EventArgs) HandlesbtnQuit.Click

        con.Dispose()

        End

    End Sub

 

    Private Sub btnOk_Click(sender AsSystem.Object, e AsSystem.EventArgs) HandlesbtnOk.Click

        '''DimsqlComd As New SqlCommand

        'da.Update(ds,"customers")

        'MessageBox.Show("数据更新已完成")

    End Sub

End Class

 

到此处数据更新功能未能实现,待续……

  • 7
    点赞
  • 28
    收藏
  • 打赏
    打赏
  • 1
    评论
表格控件总览:   在VB开发环境,表格控件在界面开发元素占有重要的地位。它不仅有外观整洁、表达形式规范的优点,而且更重要的是它较高的信息表现率(就是相对于其他控件来说能够表达更多的信息),随着信息时代的到来,它的应用将更加的广泛。    那么在VB平台下,如何操作这一功能强大的控件元素呢?事实上我们知道,VB平台下面的表格控件是相当丰富的,总结下来提供了4种类型:Microsoft Data Bound grid Control、Microsoft Datagrid Control、Microsoft Flexgrid Control、Microsoft Hierarchial Flexgrid Control. 这四种表格各有其特点,下面我们一一讨论。   1. Microsoft Data Bound grid Control   此控件主要用于数据绑定(可以不绑定,但是因为不提供对单个cell的控制支持,所以实际上这样做是不经济的)。具体说来,就是数据源比较固定的情况下可以使用这种控件。   具体使用方法是设定此控件的datasource属性,就可以不用编写任何代码就可以显示该数据源所指向的记录数据。比如可以将datasource设置为一个data控件,而data控件又指向数据库"成绩"的 一个"语文"表,那么当程序运行时,它就自动显示此"语文"表的数据。 基本步骤如下: 1、向工程上添加Microsoft Data Bound Grid Control控件,即DBGrid控件。 2、在窗体上添加DBGrid控件DBGrid1和Data控件Data1。 3、设置Data1的DatabaseName属性为你要看的数据库的名字。 4、设置Data1的RecordSource属性为表的名字或合法的SQL Select语句。 5、设置DBGrid1的DataSource属性为Data1。   从上面的分析看得出来,这个控件虽然操作方便,但是它也有局限性,就是不能对显示的数据进行灵活的控制操作,比如有些数据允许用户修改,有些数据却不允许用户修改,而此控件却只能提供全部数据源的原子操作:即要么全部允许修改,要么就全部不允许。还有另外此控件也不提供对单个单元格(cell)进行操作,所以提供不了更为个性化的界面风格。   2. Microsoft Datagrid Control   此控件跟前面介绍的Data Bound grid Control控件很相似,也是主要进行绑定操作,而缺点和Data Bound grid Control完全一样。但是它跟Data Bound grid Control不一样的是其数据源的驱动引擎只能是OLEDB形式的,不能是DAO,比如就可以使用ADO数据控件,不能使用DATA控件。而Data Bound grid Control却刚好和它相反,这一点在开发一定要注意。   3. Microsoft Flexgrid Control与Microsoft Hierarchial Flexgrid Control.   这里重点介绍这两种控件,因为在实际开发,这两种控件应用的场合更多一些,它不仅能够反映数据,而且也能把数据的修改信息反映到数据库去,所以弥补了上述两种控件的不足。   如果数据不需要修改,那么可以进行绑定操作,其方法跟前面介绍的完全一样,就是通过设置DataSource属性来完成数据的显示工作。但是实际开发,需要对整个表格控件更为灵活的显示控制。   在给出例程之前,有必要对这一控件进行比较详尽的认识:这种控件允许将文本或者图象放置于每个单元格之控件的Row与Col属性允许用户在代码指定当前行和列,当然也可通过操作鼠标和键盘来改变这两个属性,而text属性指明当前单元格的文本。如果单元格的文本太长而不能完全显示出来的话,可以通过将WordWrap属性设置为true来达到显示的目的。下面将比较重要的属性小结如下:   DataSource---------用来指定需要绑定的数据源,比如data控件。   Cellpicture----------用来设定当前单元格的图象,便于显示该图象。此属性不能在设计时使用。   Col,Row---------------设定当前列和当前行,注意它们均是从0开始的,如果同时设定它们,可以指定当前的单元格。设计时也不能使用。   Cols,Rows---------------设置表格控件总的列数和行数。   Hwnd---------------表格句柄,可以结合Windows API对表格控件进行更高级的控制。   Text---------------指定当前的单元格的文本内容。   TextMatrix(i,j)-------此属性比较重要,它用来指定第I行和第j列所确定的单元格的文本内容。它等价于下面的代码: MSHFlexGrid1.Rows =i MSHFlexGrid1.Cols =j MSHFlexGrid1.Text =指定的字符串   WordWrap-------为ture时可以在当前单元格换行显示,否则如果要显示的字符的长度超过列宽,那么就不能显示完全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

jxjxlc

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值