• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
愛如風過
我想到一个地方,那里最好一年下2次雨,1次下半年!
博客园    首页    新随笔    联系   管理    订阅  订阅
Asp.net中DataGrid控件的自定义分页 (转贴)

 

 

 

         使用 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>

 

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

 

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

 

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,refint recordCount,refint 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{returnthis.DataGrid1.PageCount;}

 

}

 

 

public int PageSize

 

{

 

     get{returnthis.DataGrid1.PageSize;}

 

}

 

 

public int PageIndex

 

{

 

     get{returnthis.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();

 

     }

 

}

 

显示界面如下:

 

 


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

 

posted on 2006-03-21 14:49  愛如風過  阅读(152)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3