为DataGrid自定义分页添加自定义导航和分页信息

         在上一篇文章中我讲到了DataGrid实行自定义分页,这可以避免为了显示一页数据而获取整个数据记录集,从而提高分页效率,不过使用的导航还是DataGrid自带的数字连接或简单的上一页,下一页,而且看不到总页数、总记录数之类的信息。

         先来看看修改后的分页显示,截图如下:

使用的数据源同上一篇文章(Asp.net中DataGrid控件的自定义分页)相同,都是访问Northwind库,为了独立开来这里还是把存储过程列了一下,

CREATE PROCEDURE [GetCustomersDataPage] 
	@PageIndex INT,
	@PageSize  INT,
	@RecordCount INT OUT,
	@PageCount INT OUT
AS
SELECT @RecordCount = COUNT(*)  FROM   Customers
SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize) 
DECLARE @SQLSTR NVARCHAR(1000)
IF @PageIndex = 0 OR @PageCount <= 1
	SET @SQLSTR =N'SELECT TOP '+STR( @PageSize )+
'  CustomerID, CompanyName,Address,Phone  FROM   Customers ORDER BY CustomerID DESC
ELSE IF	 @PageIndex = @PageCount - 1		
	SET @SQLSTR =N' SELECT * FROM ( SELECT TOP '+STR( @RecordCount - @PageSize * @PageIndex )+
'  CustomerID, CompanyName,Address,Phone  FROM   Customers ORDER BY CustomerID ASC ) TempTable  ORDER BY CustomerID DESC'
ELSE	
 	SET @SQLSTR =N' SELECT TOP  '+STR( @PageSize )+' * FROM ( SELECT TOP '+STR( @RecordCount - @PageSize * @PageIndex )+
'  CustomerID, CompanyName,Address,Phone  FROM   Customers ORDER BY CustomerID ASC ) TempTable ORDER BY CustomerID DESC'

EXEC (@SQLSTR)
GO

下面就就把代码贴了一下,

Aspx文件代码如下:

<%@ Page language="c#" Codebehind="DataGridCustomPaging.aspx.cs" AutoEventWireup="false" Inherits="ZZ.AspnetPaging.DataGridCustomPaging" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
	<HEAD>
		<title>DataGridPaging</title>
		<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
		<meta content="C#" name="CODE_LANGUAGE">
		<meta content="JavaScript" name="vs_defaultClientScript">
		<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
	</HEAD>
	<body>
		<form id="Form1" method="post" runat="server">
			<TABLE id="Table1" style="FONT-SIZE: 9pt" cellSpacing="1" cellPadding="1" width="450" align="center"
				border="1">
				<TR>
					<TD><asp:datagrid id="DataGrid1" runat="server" AllowPaging="True" AllowCustomPaging="True" Width="100%">
							<FooterStyle Font-Size="9pt"></FooterStyle>
							<HeaderStyle Font-Size="9pt"></HeaderStyle>
							<PagerStyle Visible="False" Font-Size="9pt" Mode="NumericPages"></PagerStyle>
						</asp:datagrid></TD>
				</TR>
				<TR>
					<TD>
						<TABLE id="Table2" style="FONT-SIZE: 9pt" cellSpacing="1" cellPadding="1" width="100%"
							align="center" border="1">
							<TR>
								<TD style="WIDTH: 150px"><asp:linkbutton id="LBtnFirst" runat="server" CommandName="First">首页</asp:linkbutton>&nbsp;
									<asp:linkbutton id="LBtnPrev" runat="server" CommandName="Prev">上一页</asp:linkbutton>&nbsp;
									<asp:linkbutton id="LBtnNext" runat="server" CommandName="Next">下一页</asp:linkbutton>&nbsp;
									<asp:linkbutton id="LBtnLast" runat="server" CommandName="Last">尾页</asp:linkbutton></TD>
								<TD>第<asp:literal id="LtlPageIndex" runat="server"></asp:literal>页&nbsp; 共<asp:literal id="LtlPageCount" runat="server"></asp:literal>页&nbsp; 
									每页<asp:Literal id="LtlPageSize" runat="server"></asp:Literal>条&nbsp; 共<asp:Literal id="LtlRecordCount" runat="server"></asp:Literal>条&nbsp;
								</TD>
							</TR>
						</TABLE>
					</TD>
				</TR>
			</TABLE>
		</form>
	</body>
</HTML>

Aspx.cs文件代码如下:

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Configuration;

namespace ZZ.AspnetPaging
{
	public class DataGridCustomPaging : System.Web.UI.Page 
	{
		private int pageCount;
		private int recordCount;

		protected System.Web.UI.WebControls.LinkButton LBtnFirst;
		protected System.Web.UI.WebControls.LinkButton LBtnPrev;
		protected System.Web.UI.WebControls.LinkButton LBtnNext;
		protected System.Web.UI.WebControls.LinkButton LBtnLast;
		protected System.Web.UI.WebControls.Literal LtlPageIndex;
		protected System.Web.UI.WebControls.Literal LtlPageCount;
		protected System.Web.UI.WebControls.Literal LtlPageSize;
		protected System.Web.UI.WebControls.Literal LtlRecordCount;
		protected System.Web.UI.WebControls.DataGrid DataGrid1;
	
		private void Page_Load(object sender, System.EventArgs e)
		{
			if(!Page.IsPostBack)
			{
				DataGridDataBind();
			}
		}

		//绑定数据
		private void DataGridDataBind()
		{
			DataSet ds = GetCustomersData(PageIndex,PageSize,ref recordCount,ref pageCount);
			this.DataGrid1.VirtualItemCount = RecordCount;
			this.DataGrid1.DataSource = ds;
			this.DataGrid1.DataBind();
			SetPagingState();
		}

		#region Web 窗体设计器生成的代码
		override protected void OnInit(EventArgs e)
		{
			InitializeComponent();
			base.OnInit(e);
		}
		
		private void InitializeComponent()
		{    
			this.LBtnFirst.Click += new System.EventHandler(this.LBtnNavigation_Click);
			this.LBtnPrev.Click += new System.EventHandler(this.LBtnNavigation_Click);
			this.LBtnNext.Click += new System.EventHandler(this.LBtnNavigation_Click);
			this.LBtnLast.Click += new System.EventHandler(this.LBtnNavigation_Click);
			this.Load += new System.EventHandler(this.Page_Load);
		}
		#endregion

		private static DataSet GetCustomersData(int pageIndex,int pageSize,ref int recordCount,ref int pageCount)
		{
			string connString = ConfigurationSettings.AppSettings["ConnString"];
			SqlConnection conn = new SqlConnection(connString);
			SqlCommand comm = new SqlCommand("GetCustomersDataPage",conn);
			comm.Parameters.Add(new SqlParameter("@PageIndex",SqlDbType.Int));
			comm.Parameters[0].Value = pageIndex;
			comm.Parameters.Add(new SqlParameter("@PageSize",SqlDbType.Int));
			comm.Parameters[1].Value = pageSize;
			comm.Parameters.Add(new SqlParameter("@RecordCount",SqlDbType.Int));
			comm.Parameters[2].Direction = ParameterDirection.Output;
			comm.Parameters.Add(new SqlParameter("@PageCount",SqlDbType.Int));
			comm.Parameters[3].Direction = ParameterDirection.Output;
			comm.CommandType = CommandType.StoredProcedure;
			SqlDataAdapter dataAdapter = new SqlDataAdapter(comm);
			DataSet ds = new DataSet();
			dataAdapter.Fill(ds);
			recordCount = (int)comm.Parameters[2].Value;
			pageCount = (int)comm.Parameters[3].Value;
			return ds;
		}

		private void LBtnNavigation_Click(object sender, System.EventArgs e)
		{
			LinkButton btn = (LinkButton)sender;
			switch(btn.CommandName)
			{
				case "First":
					PageIndex = 0;
					break;
				case "Prev"://if( PageIndex > 0 )
						PageIndex = PageIndex - 1;
					break;
				case "Next"://if( PageIndex < PageCount -1)
						PageIndex = PageIndex + 1;
					break;
				case "Last":
					PageIndex = PageCount - 1;
					break;
			}
			DataGridDataBind();			
		}

		/// <summary>
		/// 控制导航按钮或数字的状态
		/// </summary>
		public void SetPagingState()
		{
			if( PageCount <= 1 )//( RecordCount <= PageSize )//小于等于一页
			{
				this.LBtnFirst.Enabled = false;
				this.LBtnPrev.Enabled = false;
				this.LBtnNext.Enabled = false;
				this.LBtnLast.Enabled = false;
			}
			else //有多页
			{
				if( PageIndex == 0 )//当前为第一页
				{
					this.LBtnFirst.Enabled = false;
					this.LBtnPrev.Enabled = false;
					this.LBtnNext.Enabled = true;
					this.LBtnLast.Enabled = true;								
				}
				else if( PageIndex == PageCount - 1 )//当前为最后页 
				{
					this.LBtnFirst.Enabled = true;
					this.LBtnPrev.Enabled = true;
					this.LBtnNext.Enabled = false;
					this.LBtnLast.Enabled = false;								
				}
				else //中间页
				{
					this.LBtnFirst.Enabled = true;
					this.LBtnPrev.Enabled = true;
					this.LBtnNext.Enabled = true;
					this.LBtnLast.Enabled = true;
				}
			}
		
			this.LtlPageSize.Text = PageSize.ToString();
			this.LtlRecordCount.Text = RecordCount.ToString();
			if(RecordCount == 0)
			{
				this.LtlPageCount.Text = "0";
				this.LtlPageIndex.Text = "0";
			}	
			else
			{
				this.LtlPageCount.Text = PageCount.ToString();
				this.LtlPageIndex.Text = (PageIndex + 1).ToString();
			}
		}

		
		public int PageCount
		{
			get
			{
				return this.DataGrid1.PageCount;
			}	
		}

		public int PageSize
		{
			get
			{
				return this.DataGrid1.PageSize;
			}			
		}

		public int PageIndex
		{
			get
			{
				return this.DataGrid1.CurrentPageIndex;
			}
			set
			{
				this.DataGrid1.CurrentPageIndex = value;
			}
		}

		public int RecordCount
		{
			get
			{
				return recordCount;
			}			
		}
	}
}

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值