新闻系统——真假分页

       牛腩中,当我们的新闻数据很少时,完全可以在一页显示,而且也不会破坏界面的布局,但当数据很多的时候,就会影响页面的布局,而且用户等待时间就会加长,试想谁会愿意一直在等待呢?我们就必须想办法来解决这个问题。

一种方法为假分页,另一种方法为真分页。

假分页:

将数据库中数据全部取出来之后,在显示的时候分页显示,这样当数据库中数据量很多的时候就会一直等待。

实现假分页的代码。

        /// <summary>
        /// 点击下一页
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gvHotNews_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvHotNews.PageIndex = e.NewPageIndex;
            NewsManager nm = new NewsManager();

            gvHotNews.DataSource = nm.SelectNewNews();
            gvHotNews.DataBind();
        }
代码很简单,但是必须在web中添加这个事件(红字部分),否则无法触发该方法:

     <asp:GridView ID="gvNewNews" runat="server" AutoGenerateColumns="False" BorderWidth="0"               GridLines="None" AllowPaging="True" <span style="color:#ff0000;">OnPageIndexChanging ="gvNewNews_PageIndexChanging" </span>               PageSize="5">
真分页:

顾名思义,就是直接从数据库中取出该页面显示的新闻,当跳转到下一页再取出该页所需要的数据,这样就实现了真正的分页,从源头来解决问题。

1、添加AspNetPager控件(需要下载)、

2、添加.dll文件,并且添加到工具箱中

3、实现

     Web

   <span style="font-family:KaiTi_GB2312;"> 界面: <webdiyer:AspNetPager ID="anp" runat="server" FirstPageText ="首页" 
              LastPageText ="尾页" NextPageText ="下一页" PrevPageText ="上一页" 
              OnPageChanged ="anp_PageChanged" PageSize ="5" AlwaysShow ="true" >
          </webdiyer:AspNetPager></span>
    <span style="font-family:KaiTi_GB2312;">实现  protected void Page_Load(object sender, EventArgs e)
            {              
                //已登录
                if (!Page.IsPostBack)
                {
                    DataTable dt = new DataTable();
                    dt = nm.SelectAll();
                    anp.RecordCount = dt.Rows.Count;
                    BindNews();
                }
             }</span>

<span style="font-family:KaiTi_GB2312;font-size:18px;">        //绑定新闻列表
        public void BindNews()
        {
            int start = anp.StartRecordIndex;
            int end = anp.EndRecordIndex;
            
            repNews.DataSource = new NewsManager().SelectPage(start,end );
            repNews.DataBind();
        }</span>

                D层

        <span style="font-family:KaiTi_GB2312;">/// <summary>
        /// 新闻分页显示
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <returns></returns>
        public DataTable SelectPage(int start, int end)
        {
            DataTable dt = new DataTable();
            string cmdText = "news_selectPage";
            SqlParameter[] paras = new SqlParameter[]{
                new SqlParameter ("@start",start ),
                new SqlParameter ("@end",end)
            };
            dt = sqlhelper.ExecuteQuery(cmdText, paras, CommandType.StoredProcedure );
            return dt;
        }</span>
存储过程:

      <span style="font-family:KaiTi_GB2312;">CREATE PROCEDURE [dbo].[news_selectPage]
	   @start integer,
	   @end integer
      AS
      BEGIN
		SET NOCOUNT ON;
		with tempt as (
		SELECT ROW_NUMBER() over (order by id desc )as row, * from news T)
		SELECT * FROM tempt where row between @start and @end
		 
      END
      GO</span>
接下来直接B层来调用D层,只要写一个方法就可以了,这里不再详细写了。下面是显示效果:

                       

在这之中会出现一个问题:


       经过查阅资料——AspNetPager分页示例—配合UpdatePanel实现无刷新分页看了代码之后,终于找到原因,将ScriptManager添加到UpdatePanel之前,如图所示:

       

      这一番奋斗之后,终于实现了真假分页,真假分页实际上就是我们是否从根源解决问题,真分页从源头解决了问题,假分页只是从表相来实现了。真分页在之后的网页设计中还会遇到,多实践才能多发现,一起向前奋斗吧。


原文地址:https://www.cnblogs.com/zsswpb/p/5771650.html