导航

  1. 常用CHM
  2. 订阅
  • 本站大部分内容从网上收集,收集目的仅供研究、学习。涉及版权或不希望收录您的文章请您及时与我联系。
  • 本站IM群,请自行选择。请各位朋友按照自己喜好加入。加入群后请及时发言,防止被清理。谢谢您的合作!!!
  • QQ群:Y①WEB开发(ASP.NET)号码:7351660 QQ群:Y②WEB开发(ASP+.NET)号码:11864905
  • QQ群:Y③WEB开发(DIV+CSS)号码:16610506 QQ群:Y④WEB开发(JS+AJAX)号码:16143998
  • QQ群:Y⑤WEB开发(新手)号码:12777715 MSN群:yaosansi[at]126.com
« 使用ASP.NET中调用WebService时不能以Name为数据库中的字段通过ASP.NET远程杀死进程 »

Asp.net中DataGrid控件的自定义分页

分类: ASP.NET 发布: yaosansi 浏览: 日期: 2005年12月18日

 

Asp.netDataGrid控件的自定义分页

 


 

         使用DataGrid时自带的分页实现起来虽然比较方便,但是效率不高,每次都需要读取所有页(整个记录集),而加载的只是其中一页,造成了资源的浪费,记录多又会使效率变得很低。下面通过DataGrid的自定义分页功能来减少资源使用和提高效率。

 

         实现的关键是设置AllowCustomPaging属性位True,并把VirtualItemCount属性设置位总的记录数,给分页提供依据,前台的主要代码如下:

 

<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" Width="100%" AllowPaging="True" AllowCustomPaging="True">

 

                                                                 <PagerStyle Font-Size="9pt" Mode="NumericPages"></PagerStyle>

 

                                                        </asp:datagrid></TD>

 

                                     </TR>

 

                            </TABLE>

 

                   </form>

 

这里使用的数据源还是假设为NorthwindCustomers表。

 

下面是访问单页的存储过程,实现方式很多,不过这个是最普通的,

 

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

 

获取记录数和页数都采用存储过程的输出参数。

 

获取数据源,这里返回一个DataSet

 

先定义了连个数据成员,

 

private int pageCount;//页数

 

private int recordCount;//记录数

 

//获取单页数据

 

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;

 

}

 

//绑定数据到DataGrid,同时刷新数据总记录数

 

private void DataGridDataBind()

 

{

 

     DataSet ds = GetCustomersData(PageIndex,PageSize,ref recordCount,ref pageCount);

 

     this.DataGrid1.VirtualItemCount = RecordCount;

 

     this.DataGrid1.DataSource = ds;

 

     this.DataGrid1.DataBind();

 

}

 

下面是分页的几个变量属性

 

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;}

 

}

 

注册DataGrid分页事件

 

//分页事件处理

 

private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)

 

{

 

     DataGrid dg = (DataGrid)source;

 

     dg.CurrentPageIndex = e.NewPageIndex;

 

     DataGridDataBind();

 

}

 

最好判断当前页面是否是第一次加载,防止重复加载两次数据,

 

private void Page_Load(object sender, System.EventArgs e)

 

{

 

     if(!Page.IsPostBack)

 

     {

 

         DataGridDataBind();

 

     }

 

}

 

显示界面如下:

 




 


这个例子中没有显示分页的一些参数,我们可以进一步对其进行改进。

 

相关文章:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-Blog 1.8 Walle Build 100427

Copyright 2005-2010 yaosansi'site All Rights Reserved.
感谢系统大玩家为本站提供FTP空间
辽ICP备05021434号