看到在CSDN中已经有了不少自定义分页的例子,参考了很多,但是老觉得别人写的功能不是很完备,自己也摸索的写了一个,主要参考了“孟子E章”的分页例子。
这里使用的是VB.net语言。
DataGridPaging.aspx
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="DataGridPaging.aspx.vb" Inherits="Webwuye.DataGridPaging"%> 参考下面我的回复中,这里帖不上代码。
|
DataGridPaging.aspx.vb
Imports System.Data.SqlClient Imports System.Data Imports System.Web.UI
Public Class DataGridPaging Inherits System.Web.UI.Page
Protected WithEvents btnFirst As System.Web.UI.WebControls.LinkButton Protected WithEvents btnPrev As System.Web.UI.WebControls.LinkButton Protected WithEvents btnNext As System.Web.UI.WebControls.LinkButton Protected WithEvents btnLast As System.Web.UI.WebControls.LinkButton Protected WithEvents lblCurrentIndex As System.Web.UI.WebControls.Label Protected WithEvents lblPageCount As System.Web.UI.WebControls.Label Protected WithEvents lblRegisterCount As System.Web.UI.WebControls.Label Protected WithEvents DataGrid As System.Web.UI.WebControls.DataGrid Protected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid
#Region " Web Form Designer Generated Code "
'This call is required by the Web Form Designer. <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init 'CODEGEN: This method call is required by the Web Form Designer 'Do not modify it using the code editor. InitializeComponent() End Sub
#End Region
Dim cnn As New SqlConnection("Password=; User ID=sa;Initial Catalog=northwind;Data Source=localhost;Connect Timeout=30") Dim adp As New SqlDataAdapter Dim cmd As New SqlCommand Dim ds As New DataSet
' Dim intStartIndex As Long
'定义全局静态变量,记录选中页面之前的总记录数 Private Shared preceding As Long Private Shared gridPageSize As Int16
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
btnFirst.Text = "最首页" btnPrev.Text = "前一页" btnNext.Text = "下一页" btnLast.Text = "最后页"
If Not IsPostBack Then Try Dim cmd As New SqlCommand("select count(*) from products", cnn) cnn.Open() '设置在使用自定义分页时 DataGrid 控件中的实际项数。 'Dim i As Int16 'i = cmd.ExecuteScalar() 'MyDataGrid.VirtualItemCount=(i / MyDataGrid.PageSize) DataGrid1.VirtualItemCount = cmd.ExecuteScalar() Catch ex As Exception Response.Write("<script language=javascript>alert('错误原因:' + exp.tostring() )</script>") Finally cnn.Close() End Try preceding = DataGrid1.PageSize BindGrid()
End If
End Sub
Sub BindGrid() '使用DataSet方法填充DataGrid Dim str As String = " * " 'Dim gridPageSize As Int16 = DataGrid1.PageSize gridPageSize = DataGrid1.PageSize
Dim cmdNumber As New SqlCommand("select count(*) from products ", cnn)
Try cnn.Open() '设置在使用自定义分页时 DataGrid 控件中.VirtualItemCount存放总的实际项数。 DataGrid1.VirtualItemCount = cmdNumber.ExecuteScalar()
'使用求余保证最后一页的合理显示 If preceding >= DataGrid1.VirtualItemCount Then gridPageSize = DataGrid1.VirtualItemCount Mod DataGrid1.PageSize If gridPageSize = 0 Then gridPageSize = DataGrid1.PageSize End If End If
str = "select " + str + " from( select top " & gridPageSize.ToString + str + " from( select top " + CStr(preceding) + str + " from products where productID >0 order by productID ) as p order by productID desc )as p order by productID "
Cmd.CommandText = str Cmd.Connection = cnn adp.SelectCommand = Cmd 'adp = New SqlDataAdapter(str, cnn) adp.Fill(ds, "products") DataGrid1.DataSource = ds.Tables("products").DefaultView DataGrid1.DataBind() Catch ex As Exception Response.Write("错误原因:" + ex.ToString()) 'Throw ex Finally If cnn.State = ConnectionState.Open Then cnn.Close() End If End Try
ShowStats() HideButton()
End Sub
' ------------------------------------------- 下面是分页功能 -----------------------------------------------
Sub DataGrid1_Page(ByVal sender As Object, ByVal e As DataGridPageChangedEventArgs) '点击GRID某一页时发生 'GridXQ.aspx中DataGrid 的 OnPageIndexChanged="DataGrid1_Page"
preceding = (e.NewPageIndex + 1) * DataGrid1.PageSize DataGrid1.CurrentPageIndex = e.NewPageIndex BindGrid() ShowStats() HideButton() End Sub
Sub PagerButtonClick(ByVal sender As Object, ByVal e As EventArgs) 'used by external paging UI
'页面上Grid下方 linkbutton 的 onclick="PagerButtonClick" CommandArgument="next/prev/last/……" Dim arg As String = sender.CommandArgument
Select Case arg Case "next" If (DataGrid1.CurrentPageIndex <= (DataGrid1.PageCount - 1)) Then DataGrid1.CurrentPageIndex += 1 If DataGrid1.CurrentPageIndex = DataGrid1.PageCount - 1 Then preceding = DataGrid1.VirtualItemCount Else preceding += gridPageSize End If End If Case "prev" If (DataGrid1.CurrentPageIndex > 0) Then If DataGrid1.CurrentPageIndex = DataGrid1.PageCount - 1 Then preceding = (DataGrid1.PageCount - 1) * DataGrid1.PageSize Else preceding -= gridPageSize End If DataGrid1.CurrentPageIndex -= 1 End If Case "last" DataGrid1.CurrentPageIndex = (DataGrid1.PageCount - 1) preceding = DataGrid1.VirtualItemCount Case Else 'page number 因为在button.commandArgument设置为0 DataGrid1.CurrentPageIndex = System.Convert.ToInt32(arg) preceding = DataGrid1.PageSize End Select
If (DataGrid1.CurrentPageIndex = (DataGrid1.PageCount - 1)) Then btnNext.Enabled = False Else btnNext.Enabled = True End If
If (DataGrid1.CurrentPageIndex = 0) Then btnPrev.Enabled = False Else btnPrev.Enabled = True End If
BindGrid() ShowStats() HideButton() End Sub
Sub ShowStats()
lblCurrentIndex.Text = "第 " + (DataGrid1.CurrentPageIndex + 1).ToString() + " 页" lblPageCount.Text = "总共 " + DataGrid1.PageCount.ToString() + " 页" lblRegisterCount.Text = "共有 " + DataGrid1.VirtualItemCount.ToString + " 条记录" End Sub
Sub HideButton() If (DataGrid1.CurrentPageIndex = (DataGrid1.PageCount - 1)) Then btnNext.Enabled = False btnLast.Enabled = False Else btnNext.Enabled = True btnLast.Enabled = True End If
If (DataGrid1.CurrentPageIndex = 0) Then btnPrev.Enabled = False btnFirst.Enabled = False Else btnPrev.Enabled = True btnFirst.Enabled = True End If End Sub End Class

|