CSDN博客

img ninesong

ASP.net中的Datagrid自定义分页功能

发表于2003/11/16 10:39:00  803人阅读

看到在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

 

 

0 0

相关博文

我的热门文章

img
取 消
img