分页技术是数据中技术中经常用到的、也是全心全意为人们的服务理念的以后总体现。在现实生活中数据的信息比较多,这些信息往往不是人们全部需要的。所以用分页的技术方便用户翻阅页面,查找有用的信息。要是做到像百度和淘宝一样,根据用户平时阅读信息的习惯,自动配置首页的信息那就更贴心了!
在牛腩新闻发布系统中提到两种分页的方式:1、假分页 2、真分页
一、假分页
GridView 控件分页
public partial class text : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { //开始绑定 BindNews(); } } #region 绑定新闻列表 /// <summary> /// GridView 绑定数据源 /// </summary> private void BindNews() { repNews.DataSource = new NewsManager().SelectAll(); repNews.DataBind(); } #endregion //实现翻页效果 protected void repNews_PageIndexChanging1(object sender, GridViewPageEventArgs e) { repNews.PageIndex = e.NewPageIndex; BindNews(); } }
需要注意的是要设置Gridview的AllowPaging 为True
通过代码也可以看出假分页是把数据库中的数据全部加载到前台,然后在前台分页。如果数据少的话,还可以接受。如果是几十万条信息,前台的压力就太大了。所以这这就引出了真分页技术。
二、真分页
控件设置代码:
<webdiyer:AspNetPager ID="anp" FirstPageText=" : 首页" LastPageText=" 尾页" NextPageText=" 下一页" runat="server" OnPageChanged="anp_PageChanged" PageSize="8" PrevPageText =" 上一页" CustomInfoHTML="共%RecordCount%条记录,共%PageCount%页 " ShowCustomInfoSection="Left" ShowPageIndexBox="Never" CssClass ="paginator" CurrentPageButtonClass="cpb" AlwaysShow="true" CustomInfoSectionWidth=""></webdiyer:AspNetPager> <asp:Repeater ID="repNews" runat="server">
U层传入数据绑定数据源代码:
public partial class newsmanager : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //判断session里面是否存在管理员 if (Session["admin"] != null && Session["admin"].ToString() == "niunan") { if (!Page.IsPostBack) { //第一次进入该页面时 DataTable dt = new DataTable(); dt = new NewsManager().SelectAll();//选择所有新闻 anp.RecordCount = dt.Rows.Count; //记录总数 //开始绑定记录 BindNews(); } } else { Response.Redirect("login.aspx"); } } #region 绑定新闻列表 private void BindNews() { int startIndex = anp.StartRecordIndex; //开始记录数 int endIndex = anp.EndRecordIndex; //结束记录数 repNews.DataSource = new NewsManager().SelectByPage(startIndex, endIndex); repNews.DataBind(); } #endregion #region 控件的切换实现数据库的数据交换 /// <summary> ///控件的切换实现数据库的数据交换 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void anp_PageChanged(object sender, EventArgs e) { //控件的切换实现数据库的数据交互 BindNews(); } #endregion #region 删除按钮 /// <summary> /// 删除按钮 /// </summary> /// <param name="sender"></param> /// <param name="s"></param> protected void lbtnDel_Click(object sender, EventArgs s) { string id = ((LinkButton)sender).CommandArgument; bool b = new NewsManager().Delete(id); if (b) { BindNews(); } else { Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('删除失败,请联系管理员!');</script>"); } } #endregion }
数据库中的存储过程
ALTER PROCEDURE [dbo].[partPage] @startIndex int, --查询开始记录数 @endIndex int --结束记录数 AS BEGIN with temptbl as ( SELECT ROW_NUMBER() OVER (ORDER BY id desc)AS 行号, * from news --使得记录按顺序排列,按行号查询 ) SELECT * FROM temptbl where 行号 between @startIndex and @endIndex --传入开始和结束的参数,执行查询 END
这里的Repeater控件 也可以换成Gridview控件效果差不多。这里所讲的真分页重点还是AspNetPager控件在其作用。AspNetpager控件把每页的数据排成循序序列,通过点击页码传入数据库。告诉数据库要多少号到多少号的数据,而数据库中通过SQL代码把每条数据也排成有序数列。这样通过穿到数据库中的2个数就可在数据库中查询出那页的数据。也就实现了后台的分页。
总结:在敲系统的时候要时时刻刻想着系统的效率,之前敲代码总是想着实现就行。万丈高楼平地起,想要走的更远,先把基本功打好。所以以后要努力做出完美的系统。