本文共 4219 字,大约阅读时间需要 14 分钟。
最近做过的项目中都需要翻页功能,而翻页的数据有多又少,经过实践写出了这篇博文。
当要显示数据量足够大的时候,我们往往采用分页显示的处理办法。分页有真分页和假分页。 假分页 从数据库中取出所有的数据,然后分页在界面上显示。访问一次数据库,但由于选择的数据量比较大,所以第一次花费时间比较长,但之后每一页的显示都是直接、快速的,避免对数据库的多次访问。 真分页 确定要显示的数量和内容,然后每次都去数据库取出该少量数据,优点是数据量小,缺点是访问数据库频繁。在大型网站中往往采用真分页,比如百度的图片获取。 区别 所谓的真假分页的实质区别在于:1.是否每次翻页都需要查询数据;2.预测查询结果数据集是否庞大。 在新闻发布系统采用真分页。Web层用AspNetPager控件和Repeater控件显示。在后端设计思路如下: 查询所有新闻的记录总数,从而得到AspNetPager的RecordCount属性值。设置PageSize属性,确定每页显示的记录条数。以上两个属性就可以确定所有这些记录要分多少页显示。由控件的StartRecordIndex和EndRecordIndex属性可以确定当前页要显示的记录起止索引号,从而可以方便的从数据库中查询。查询得到的datatable即为repeater绑定的数据源。代码如下
web端代码:Web层后台代码:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using BLL;using Model;using System.Data;using System.Data.SqlClient;namespace niunan.admin{ public partial class NewsManager : System.Web.UI.Page { BLL.NewsManager newm = new BLL.NewsManager(); protected void Page_Load(object sender, EventArgs e) { #region 加载分页 if (!Page.IsPostBack) { DataTable dt = newm.SelectAll(); AspNetPager1.RecordCount = dt.Rows.Count; Bind_News(); } #endregion #region 分页绑定新闻 ////// 分页绑定新闻 /// private void Bind_News() { int startIndex = AspNetPager1.StartRecordIndex; int endIndex = AspNetPager1.EndRecordIndex; DataTable dt = newm.SelectToPage(startIndex, endIndex); repNews.DataSource = dt; repNews.DataBind(); } #endregion #region 分页按钮改变事件 ////// 分页按钮改变事件 /// /// /// protected void AspNetPager1_PageChanged(object sender, EventArgs e) { Bind_News(); } #endregion }}
BLL层(NewsManager.cs)代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using DAL;using Model;using System.Data;using System.Data.SqlClient;namespace BLL{ public class NewsManager { private NewsDAO ndo; public NewsManager() { ndo = new NewsDAO(); } #region 选择全部新闻 ////// 选择全部新闻 /// ///public DataTable SelectAll() { return ndo.SelectAll(); } #endregion #region /// 分页选择新闻 /// /// /// 选定页的第一条新闻索引 /// 选定页的最后一条新闻索引 ///选定页的新闻内容 public DataTable SelectToPage(int startIndex, int endIndex) { DAL.NewsDAO nd = new DAL.NewsDAO(); return nd.SelectToPage(startIndex,endIndex); } #endregion }}
DAL层(newsDAL.cs)代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Data;using System.Data.SqlClient;using DAL;using Model;namespace DAL{ public class NewsDAO { private sqlhelper sqlhelper; public NewsDAO() { sqlhelper = new sqlhelper(); } #region 选择全部新闻 ////// 选择全部新闻 /// ///public DataTable SelectAll() { DataTable dt = new DataTable(); string sql = "select * from news"; dt = new sqlhelper().ExecuteQuery(sql, CommandType.Text); return dt; } #endregion #region 分页选择新闻 /// /// 分页选择新闻 /// /// 选定页的第一条新闻索引 /// 选定页的最后一条新闻索引 ///选定页的新闻内容 public DataTable SelectToPage(int startIndex, int endIndex) { DataTable dt = new DataTable(); SqlParameter[] paras = new SqlParameter[] { new SqlParameter ("@startIndex",startIndex ), new SqlParameter("@endIndex",endIndex) }; string sql = "select * from (select ROW_NUMBER() over (order by id desc) as row,T.* from news T) as TT where TT.row between @startIndex and @endIndex"; dt = sqlhelper.ExecuteQuery(sql, paras, CommandType.Text); return dt; } #endregion }}
最终效果图如下: