上一篇:在ASP.NET访问Excel文件 >>
Asp.net中DataGrid控件的自定义分页
郑 佐 2004-10-28
使用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,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();
}
}
显示界面如下:
这个例子中没有显示分页的一些参数,我们可以进一步对其进行改进。
下一篇:将ASP.NET Control转换为String >>
相关文章:
- · ASP.NET应用程序的安全模型
- · DVNEWS 3.2 1013版免虚拟目录的安装方法,只要三个步骤
- · ASP.NET十大技巧
- · 如何更新父窗体
- · 如何在域控制器上安装asp.net?
- · Asp.net动态生成html页面
- · asp.net 2.0中一次性更新所有GRIDVIEW的记录
- · ASP.NET with C#使用md5,sha1加密初探
- · 创建虚拟目录的常用属性
- · asp.net控件加載
- · 在ASP.Net 中使用实现windows登陆的方法
- · 在ASP.NET中动态加载内容(用户控件和模板)
- · ASP.net组件编程中的两种事件编写方法
- · ASP.NET事件小探讨
- · asp.net连接Access数据库
- · [ASP.net(C#)]自定义数据库操作类(一)
- · asp.net 中用户和角色的验证
- · 在.NET中调用Oracle9i存储过程经验总结
- · 枚举类型的用法
- · Tag属性的妙用
- · 怎样得到文本框(TextBox)中的文本行数
- · ASP.NET IIS 注册工具 (Aspnet_regiis.exe)
- · 在Asp.net中部署和使用微软的TreeView控件
- · Word编程中,事件的作用和顺序
- · 关于大型网站的构架问题
- · ASP.NET中上传文件的方法(一)
- · 坚持学asp.net——(十二)
- · 在ASP.NET中跨页面实现多选
- · Securing an ASP.Net application...
- · Send Email and Attachments with ASP.Net...
- · asp.net中的多語言使用
- · 網頁中彈出對自定義對話框並進行傳值
- · 將 ASP .NET WebForm 的 DataGrid 中的資料 匯出至 Microsoft Excel
- · ASP.NET中树形图的实现
- · 细细品味ASP.NET
- · ASP.NET中制作图形
- · ASP.NET常用函数
- · ASP.NET开发经验(2) --- ASP.NET中的一些图形处理
