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

王朝asp·作者佚名  2006-01-08
宽屏版  字体: |||超大  

看到在CSDN中已经有了不少自定义分页的例子,参考了很多,但是老觉得别人写的功能不是很完备,自己也摸索的写了一个,主要参考了“孟子E章”的分页例子。

这里使用的是VB.net语言。

DataGridPaging.aspx

参考下面我的回复中,这里帖不上代码。

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

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