您的位置:首页 > 编程语言 > VB

vb.net DataGrid Windows 控件执行分页

2012-06-19 08:41 351 查看
http://support.microsoft.com/kb/305271/zh-cn

DataGrid Web 控件有内置的自动或自定义分页功能,但是 DataGrid Windows 控件却没有这些功能。本文介绍如何为 DataGrid Windows 控件生成简单的分页机制。

本文中的代码示例利用了数据集对象。在 ADO.NET 中,数据集对象是通过单次操作填充的,它们始终驻留在内存中。如果您在使用一个大型数据集,本文介绍如何以编程方式按块区或页面形式显示数据。

此技巧有一些局限性。有关更多信息,请参阅疑难解答一节。 



回到顶端


要求

Microsoft Visual Basic .NET

Microsoft SQL Server Northwind 示例数据库



回到顶端


向 DataGrid Windows 控件添加分页的步骤

当您对 DataGrid 进行分页时,您会在页面大小的"块区"中显示数据,也即,一次显示一页记录。下面的代码示例将每页的 DataRow 对象从内存中的数据集复制到一个临时表中。该临时表然后会绑定到 DataGrid 控件。

打开一个新的 Visual Basic .NET Windows 应用程序。默认情况下将创建 Form1。

添加 DataGrid 控件,将其 ReadOnly 属性设置为 True

将以下附加控件添加到 Form1 上,然后按如下所示设置它们的属性:

ControlName PropertyText Property
ButtonbtnFirstPageFirst Page
ButtonbtnNextPageNext Page
TextBoxtxtDisplayPageNo 
ButtonbtnPreviousPagePrevious Page
ButtonbtnLastPageLast Page
TextBoxtxtPageSize5
ButtonbtnFillGridFill Grid
复制下面的代码并粘贴到 Form1 的 General Declaration 部分:


Imports System
Imports System.Data
Imports System.Data.SqlClient


复制下面的代码并粘贴到"Windows Form Designer generated code"区域之前 以声明 Form1 的窗体层次变量:


Private da As SqlDataAdapter
Private ds As DataSet
Private dtSource As DataTable
Private PageCount As Integer
Private maxRec As Integer
Private pageSize As Integer
Private currentPage As Integer
Private recNo As Integer


删除 Form1 的 Load 事件自动生成的下列代码。


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load

End Sub


复制下面的代码并粘贴到"Windows Form Designer generated code"区域之后:


Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

'Open Connection.
Dim conn As SqlConnection = New SqlConnection( _
"Server=(local)\netsdk;uid=sa;pwd=;database=northwind")

'Set the DataAdapter's query.
da = New SqlDataAdapter("select * from customers", conn)
ds = New DataSet()

' Fill the DataSet.
da.Fill(ds, "customers")

' Set the source table.
dtSource = ds.Tables("customers")

End Sub

Private Sub btnNextPage_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnNextPage.Click

'If the user did not click the "Fill Grid" button then Return
If Not CheckFillButton() Then Return

'Check if the user clicked the "Fill Grid" button.
If pageSize = 0 Then
MessageBox.Show("Set the Page Size, and then click the ""Fill Grid"" button!")
Return
End If

currentPage = currentPage +1

If currentPage > PageCount Then
currentPage = PageCount

' Check if you are already at the last page.
If recNo = maxRec Then
MessageBox.Show("You are at the Last Page!")
Return
End If
End If

LoadPage()
End Sub

Private Sub btnPreviousPage_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnPreviousPage.Click

If Not CheckFillButton() Then Return

If currentPage = PageCount Then
recNo = pageSize * (currentPage -2)
End If

currentPage = currentPage - 1

' Check if you are already at the first page.
If currentPage < 1 Then
MessageBox.Show("You are at the First Page!")
currentPage = 1
Return
Else
recNo = pageSize * (currentPage - 1)
End If

LoadPage()
End Sub

Private Sub LoadPage()
Dim i As Integer
Dim startRec As Integer
Dim endRec As Integer
Dim dtTemp As DataTable
Dim dr As DataRow

'Duplicate or clone the source table to create the temporary table.
dtTemp = dtSource.Clone

If currentPage = PageCount Then
endRec = maxRec
Else
endRec = pageSize * currentPage
End If

startRec = recNo

'Copy the rows from the source table to fill the temporary table.
For i = startRec To endRec - 1
dtTemp.ImportRow(dtSource.Rows(i))
recNo = recNo + 1
Next

DataGrid1.DataSource = dtTemp
DisplayPageInfo()

End Sub

Private Sub btnFirstPage_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnFirstPage.Click

If Not CheckFillButton() Then Return

' Check if you are already at the first page.
If currentPage = 1 Then
MessageBox.Show("You are at the First Page!")
Return
End If

currentPage = 1
recNo = 0

LoadPage()

End Sub

Private Sub btnLastPage_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnLastPage.Click

If Not CheckFillButton() Then Return

' Check if you are already at the last page.
If recNo = maxRec Then
MessageBox.Show("You are at the Last Page!")
Return
End If

currentPage = PageCount

recNo = pageSize * (currentPage - 1)

LoadPage()

End Sub

Private Sub DisplayPageInfo()
txtDisplayPageNo.Text = "Page " & currentPage.ToString & "/ " & PageCount.ToString
End Sub

Private Sub btnFillGrid_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnFillGrid.Click

'Set the start and max records.
pageSize = txtPageSize.Text
maxRec = dtSource.Rows.Count
PageCount = maxRec \ pageSize

' Adjust the page number if the last page contains a partial page.
If (maxRec Mod pageSize) > 0 Then
PageCount = PageCount + 1
End If

'Initial seeings
currentPage = 1
recNo = 0

' Display the content of the current page.
LoadPage()

End Sub

Private Function CheckFillButton() As Boolean

'Check if the user clicks the "Fill Grid" button.
If pageSize = 0 Then
MessageBox.Show("Set the Page Size, and then click the ""Fill Grid"" button!")
CheckFillButton = False
Else
CheckFillButton = True
End If
End Function


修改代码中的 ConnectionString 参数以使它指向罗斯文 (Northwind) 数据库的一个现有实例。

按 F5 键生成并运行此项目。

默认情况下,将"页大小"设置为 5 个记录,您可以在文本框中更改它。

单击填充网格。注意,网格中填入了 5 个记录。

单击第一页下一页上一页 和最后一页可以在不同的页面之间浏览。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息