概述
在对网页上的记录进行分页显示时,一般用到两种方式,分别是假分页和真分页。假分页就是从数据库中取出所有记录然后再进行分页;而真分页相对来说就简单多了,真分页只需要从数据库中取出当前页需要显示的记录即可。如果你的记录数据量比较小,用哪种方法都可以,如果记录数据量特别大,这时就需要用我们的真分页来提高我们的效率。
在这里我们用aspnetpager分页控件来实现我们的真分页。aspnetpager分页控件下载的地址是:http://www.webdiyer.com/Controls/AspNetPager/Downloads
实现过程
在正式真分页实现之前,我们还需要说明一点,我们的aspnetpager将分页功能完成后还需要一个绑定数据的控件与之配合,我这里采用的是GridView控件,关于GridView控件本身也可以实现分页功能,但它属于假分页,实现起来也比较简单只需要设置两个属性(AollowPaging和PageSize)即可完成,我们就不赘余了,现在进入我们的实现过程。
1.添加AspNetPager控件
在我们vs的工具箱——右击——选择项——浏览——选择,选择完后系统会自动添加控件,到此我们该控件就添加进工具箱了,接下来就像一般控件一样拉到我们添加的页面就可。
2.实现代码
我是采用三层架构并且利用我们的存储过程实现的我们分页显示的功能,具体步骤包括:
a.建立存储过程查询语句
b.数据层进行数据查询
c.前台代码调用
a.建立存储过程查询语句
首先我们要先从数据库查询所要显示的记录,我是采用存储过程实现的这个功能,下面这就是我们存储过程的代码:
set ANSI_NULLS ON
setQUOTED_IDENTIFIER ON
go
--=============================================
--Author: 张文康
-- Create date:2013-8-7
--Description: 按页查询新闻
--=============================================
ALTER PROCEDURE[dbo].[news_selectByPage]
@startIndex int,
@endIndex int
AS
BEGIN
with temptbl as (
SELECT ROW_NUMBER()OVER (ORDER BY id desc)AS Row, * from news )
SELECT * FROMtemptbl where Row between @startIndex and @endIndex
END
b.数据层进行数据查询
DAL层:
#region (有参数查询)按页查询,根据每页显示记录数
/// <summary>
/// 按页查询,根据每页显示记录数
/// </summary>
/// <paramname="startIndex">该页开始记录数</param>
/// <paramname="endIndex">该页结束记录数</param>
/// <returns></returns>
public DataTable SelectByPage(intstartIndex, int endIndex)
{
DataTable dt = new DataTable();
string cmdText ="news_selectByPage";
SqlParameter[] paras = newSqlParameter[]{
new SqlParameter("@startIndex",startIndex ),
new SqlParameter("@endIndex",endIndex )
};
dt =sqlhelper.ExecuteQuery(cmdText, paras, CommandType.StoredProcedure);
return dt;
}
SQLHlper
#region 该方法执行传入的带参数的SQL查询语句或存储过程
/// <summary>
/// 该方法执行传入的带参数的SQL查询语句或存储过程
/// </summary>
/// <paramname="cmdText">带参数的SQL查询语句或存储过程</param>
/// <paramname="paras">参数集合</param>
/// <paramname="ct">命令类型</param>
///<returns>查询数据表</returns>
public DataTable ExecuteQuery(stringcmdText, SqlParameter[] paras, CommandType ct)
{
dt = new DataTable();
cmd = new SqlCommand(cmdText,GetConn());
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
//比try catch 更好关闭数据源的处理
using (sdr =cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
//sdr.Close();
//conn.Close(}
return dt;
}
#endregion
c.前台代码调用
using System;
usingSystem.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
usingSystem.Web.UI.WebControls;
using BLL;
using System.Data;
namespace Web
{
public partial class test :System.Web.UI.Page
{
protected void Page_Load(object sender,EventArgs e)
{
if (!Page.IsPostBack)
{
//查询总新闻条数
DataTable dt = newNewsManage().SelectAll();
int titleCount = dt.Rows.Count;
anp.RecordCount = titleCount;
//进行显示
BindNews();
}
else
{
BindNews();
}
}
//分页控件显示该页记录数
protected voidAspNetPager1_PageChanged(object sender, EventArgs e)
{
//通过换页显示记录
BindNews();
Response.Write("开始记录数:"+anp.StartRecordIndex+"<br>结束记录数"+anp.EndRecordIndex);
}
//通过分页显示记录
private void BindNews()
{
//定义该页开始记录数
int start = anp.StartRecordIndex;
//定义该页结束记录数
int end = anp.EndRecordIndex;
//绑定新闻列表
DataTable dt = newNewsManage().SelectByPage(start, end);
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
}
效果
仅仅是向大家展示我们具体的一个实现过程,所以页面样式这块我们没有进行设置,关于数据库的信息也是我临时输入的,仅仅是为了做实验用,关于AspNetPager控件的样式也有很多,大家可以自己设置。下面就是我们实现的效果图。
总结
到这里呢,利用我们的AspNetPager控件就实现了我们的真分页的功能,它可以大大提高我们的网站或系统的处理效率。关于AspNetPager控件是我们牛腩视频里讲到的,不过它里面并没有具体实现,只是提了下这个控件的好处。我们在平常学习中就是要发扬这种行动下移的风格,它提到了,我们就要实现,要跟自己较真。