前言:
原本以为今天就要发布系统成功了,但是在牛腩的最后一集,出来了一个重要的知识点,那就是真假分页,如果有感兴趣的朋友,或者还不是很明白真假分页的朋友们,可一定要看接下来的内容!因为这里有正解!
1、问题引入
如图下所示,当我们在浏览新闻时,由于新闻数量非常的多我们必须要进行分页
2、我们想要的结果
如果看着很抽象,那么我们看一下csdn评论博客的截图,它是每20条评论就有一个分页的,如下图所示:
问题引入完毕,现在我们进行分页:
3、真假分页
假分页:
如果第一次查询从数据库中取出全部数据,就是假分页,因为它跟界面展示的不一致,“表里不一”,就是假。访问一次数据库,但由于选择的数据量比较大,所以第一次花费时间比较长,但之后每一页的显示都是直接、快速的,避免对数据库的多次访问。
那么假分页如何实现呢,如图只需要在你的的aspx界面中写下这些就好了,这句话的意思就是每页份5个新闻!剩下的后端内容绑定,我就不写了。主要介绍真分页!
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" OnPageIndexChanging="GridView1_PageIndexChanging" PageSize="5">
</asp:GridView>
真分页:
确定要显示的数量和内容,然后每次都去数据库取出该少量数据,优点是数据量小,缺点是访问数据库频繁。在大型网站中往往采用真分页。
由于当数据量较大的时候,假分页就不适合了,但是我们的网站一般的记录都是比较多的,这里咱们详细介绍一下真分页是如何实现的!
接下來詳細的解決真分页:
(1)下载AspNetPager分页控件
下载地址http://write.blog.csdn.net/postedit
(2)将分页导入工具箱,导入工具箱之前先进行引用
引用操作:如果找不到就点击 浏览 到下载软件的地方,找到引用上就好了
导入工具箱:如下,右击标准下边的地方,弹出一个框,点击选择项,等一会,点击浏览,找到自己的控件,点击添加就好了,在你的工具箱的最下边就是你的AspNetPager控件了
(3) 接下来将你的AspNetPager控件拖入到你要进行分页的aspx页面中,然后写上如下代码!
<webdiyer:AspNetPager ID="AspNetPager1" runat="server" NumericButtonCount="5"
OnPageChanged="AspNetPager1_PageChanged" PageSize="6"
CustomInfoHTML=" 总计%RecordCount%条记录,共%PageCount%页"
FirstPageText=" 首页"
LastPageText=" 尾页"
NextPageText="下一页"
PrevPageText="上一页"
ShowCustomInfoSection="left"
ShowPageIndexBox="Never"
CssClass="pages"
CurrentPageButtonClass="cpb"
AlwaysShow="true">
</webdiyer:AspNetPager>
(4)前端页面搞定,现在该看后端了,页面加载(相当于u层)
/// <summary>
///绑定
/// </summary>
private void BindNews()
{
repNews.DataSource = new NewsManager().FenYeSelectALL(AspNetPager1.StartRecordIndex, AspNetPager1.StartRecordIndex+4); //+4是为了加载的时候就有5条记录
repNews.DataBind();
}
protected void Page_Load(object sender, EventArgs e)
{
//已登陆
if (!Page.IsPostBack)
{
//页面第一次加载时,绑定类别列表
BindNews()
//查询出了记录的总数
AspNetPager1.RecordCount = new NewsManager().SelectAll().Rows.Count;
}
}
(5)D层,
这里最难的就是sql查询语句,具体想知道这句话到底是干嘛的,自己放在sql中查查就知道了,篇幅太长了,我就不给大家展示为什么了!
/// <summary>
/// 选择全部新闻
/// </summary>
/// <returns></returns>
public DataTable SelectAll()
{
DataTable dt = new DataTable();
string sql = "select * from news";
dt = new SQLHelper().ExecuteQuery(sql, CommandType.Text);
return dt;
}
/// <summary>
/// 选择当页的全部新闻
/// </summary>
/// <param name="startIndex"></param>
/// <param name="endIndex"></param>
/// <returns></returns>
public DataTable FenYeSelectALL(int startIndex, int endIndex)
{
DataTable dt = new DataTable();
string sql = "with template as (select ROW_NUMBER() over(order by id desc) as 行号,*from news) select * from template where 行号 between @startIndex and @endIndex";
SqlParameter[] paras = new SqlParameter[]
{
new SqlParameter ("@startIndex",startIndex),
new SqlParameter ("@endIndex",endIndex)
};
dt = new SQLHelper().ExecuteQuery(sql, paras, CommandType.Text);
return dt;
}
(6)B层
/// <summary>
/// 选择全部新闻
/// </summary>
/// <param name="startIndex"></param>
/// <param name="endIndex"></param>
/// <returns></returns>
public DataTable FenYeSelectALL(int startIndex, int endIndex)
{
return ndao.FenYeSelectALL(startIndex, endIndex);
}
#region 选择全部新闻
/// <summary>
/// 选择全部新闻
/// </summary>
/// <returns></returns>
public DataTable SelectAll()
{
return ndao.SelectAll();
}
用了半天的时间, 将真假分页吃掉了!大功告成!
后记:
牛腩结束了,学到了很多的知识,它也给我打开了b/s的大门,前方是一路顺风,还是一路大坑呢。。。算了管它是啥,快点认真的跑吧!还有就是如果解决了你的问题,记得点个赞!