黑马程序员技术交流社区

标题: 分页问题 [打印本页]

作者: ☆丿灬北纬28°    时间: 2012-6-12 14:46
标题: 分页问题
就像一些网站上一样,怎样将一个很长的文章(例如长篇小说)进行多页显示,并且下面有各个页面的超链接&……想找一种简单的方法来实现
作者: 杨雪    时间: 2012-6-12 23:20
你在asp.net上拖一个datagridview控件,它自带分页功能,你只需对它设置每页显示多少条数据就行了
作者: 许庭洲    时间: 2012-6-13 09:28
采用DIV进行长文章分页,例如<div><%= context(文章内容) %></div>,然后直接在cs文件里面分页。
    /**//// <summary>
     /// 长内容分页 哈希表需要引用命名空间System.Collections
     /// </summary>
     /// <param name="n_content">新闻内容</param>
     /// <param name="page">是新闻当前页数</param>
     /// <param name="size">每页显示字符长度</param>
     /// <param name="linkurl">页码链接地址</param>
     /// <returns></returns>
     public System.Collections.Hashtable SeparatePages(string n_content, string page, int size,string linkurl)
     {
         //在此处放置初始化页的用户代码
         System.Collections.Hashtable returnHash = new System.Collections.Hashtable();
         int start, stops, t, stat, pp, pagecount, pagesize;
         string pa, articletxt, articletext, html;
         int pig = 0;

         //变量初始值
         stat = 0;
         start = 0; //开始查询的字符串位置,初始为0
         stops = 0;
         pagesize = size;//定义每页至少显示字符串数
         pagecount = 0;
         html = "";

         //获得当前的页数
         pa = page;
         if (pa == "" || pa == null)
         {
             pa = "1";
         }
         pp = Convert.ToInt32(pa);

         //获得内容
         articletxt = n_content;

         //判断页面的内容长度是否大于定义的每页至少显示字符串数
         if (articletxt.Length >= pagesize) // 如果大于字符串数,则我们可以分页显示
         {
             t = articletxt.Length / pagesize; //获得大致的总页数
             for (int j = 0; j <= t; j++)
             {    //如果查询开始位置到查询的范围超出整个内容的长度,那么就不用寻找断点(分页点);反之,查找
                 if (start + pagesize < articletxt.Length)
                 {
                     stat = articletxt.ToLower().IndexOf("</p>", start + pagesize); //查找</P>分页点的位置
                     if (stat == -1)
                         stat = articletxt.ToLower().IndexOf("<br>", start + pagesize); //查找</P>分页点的位置
                     if (stat == -1)
                         stat = articletxt.ToLower().IndexOf("<br/>", start + pagesize); //查找</P>分页点的位置
                 }
                 if (stat <= 0)//如果找不到
                 {

                 }
                 else
                 {
                     stops = stat; //分页点的位置也就作为这一页的终点位置

                     if (start < articletxt.Length)
                     {
                         if ((articletxt.Length - start) < pagesize)
                         {
                             if (pig == 0)
                             {
                                 pagecount = pagecount + 1;
                             }
                             pig = 1;
                         }
                         else
                         {
                             pagecount = pagecount + 1;
                         }
                     }
                     if (start + pagesize >= articletxt.Length) //如果起始位置到查询的范围超出整个内容的长度,那么这一页的终点位置为内容的终点
                     {
                         stops = articletxt.Length;
                     }
                     if (pp == j + 1) //如果是当前,那么输出当前页的内容
                     {
                         articletext = articletxt.Substring(start, stops - start); //取内容的起始位置到终点位置这段字符串输出
                         returnHash["content"] = articletext;
                     }
                     start = stat; //将终点位置作为下一页的起始位置
                 }
             }// pagecount = pagecount - 1;
         }
         else
         {
             returnHash["content"] = n_content;
         }
         //分页部分(这里就简单多了)
         //定义分页代码变量
         if (pagecount > 1) //当页数大于1的时候我们显示页数
         {
             if (pp - 1 > 0) //显示上一页,方便浏览
             { html = html + "<a href=\"" + linkurl + "&page=" + (pp - 1) + "\"> [上一页]</a> "; }
             else
             {
                 if (pp == 1)
                 { html = html + "[<font color=#cccccc& gt;上一页</font>] "; }
                 else
                 { html = html + "<a href=\"" + linkurl + "&page=\"" + (1) + "\">[上一页]</a> "; }
             }
             for (int i = 1; i <= pagecount; i++)
             {
                 if (i == pp)   //如果是当前页,加粗显示
                 { html = html + "<b>[" + i + "]</b> "; }
                 else
                 { html = html + "<a href=\"" + linkurl + "&page=" + i + "\">[" + i + "]</a> "; }
             }
             if (pp + 1 > pagecount)   //显示下一页,方便浏览
             {
                 if (pp == pagecount)
                 { html = html + "[<font color=#cccccc& gt;下一页</font>] "; }
                 else
                 { html = html + "<a href=\"" + linkurl + "&page=" + (pagecount) + "\"> [下一页]</a></p>"; }
             }
             else
             {
                 html = html + "<a href=\"" + linkurl + "&page=" + (pp + 1) + "\"> [下一页]</a></p>";
             }
         }
         returnHash["pagetxt"] = html;
         return returnHash;
     }
作者: 平建    时间: 2012-6-13 10:25
本帖最后由 平建 于 2012-6-13 10:28 编辑

给你说个简单的ASP.NET分页

1、新建一个分页存储过程:
CREATE procedure [dbo].[P_Pager]  
(@PageNumber int,
@PageSize int)
as
declare @sql nvarchar(4000)
    set @sql = 'select top ' + Convert(varchar, @PageSize)   + ' * from T_Test where [type]=1 and id not in (select top ' + Convert(varchar, (@PageNumber - 1) * @PageSize)  + ' id from T_Test order by id desc) order by id desc'
exec sp_executesql @sql
GO
2、设置Ajax控件  想要实现无刷新,肯定会用到Ajax,首先是要放入必不可少的:
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager




  接着把Repeater控件嵌入到UpdatePanel里面去:
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                   <ContentTemplate>
                           <ul>
                               <asp:Repeater ID="Repeater1" runat="server">
                                   <ItemTemplate>
                                       <li>
                                           <p>
                                               <span><%#Eval("username") %>:</span><%#Eval("content").ToString())) %></p>
                                           <p>
                                               <em>发表时间:
                                                   <%#Eval("addtime") %>
                                               </em>
                                           </p>
                                       </li>
                                   </ItemTemplate>
                               </asp:Repeater>
                           </ul>
                           <p>
                                   总记录:<asp:Literal ID="ltlCount" runat="server"></asp:Literal></p>
                               <p>
                                   <webdiyer:AspNetPager ID="AspNetPager1" runat="server" AlwaysShow="true" PageIndexBoxType="DropDownList" >
                                   </webdiyer:AspNetPager>
                               </p>
                           </div>
                   </ContentTemplate>

3、AspNetPager分页控件
  可以看到以上的代码有个分页控件,我相信这个分页控件大家都不陌生了,我就不多介绍。必须有AspNetPager.dll,然后在项目中引用,在头部引入这一段代码:
?<%@ Register Assembly="AspNetPager" Namespace="Wuqi.Webdiyer" TagPrefix="webdiyer" %>

这时候分页控件应该就可以使用了。最后在后台绑定一下数据,同时也要绑定AspNetPager控件,完整的后台代码如下:
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using Wuqi.Webdiyer;
using System.Data.SqlClient;
  
public partial class AjaxPager : System.Web.UI.Page
{
    int currentPageNumber;//当前页号   
    int pageSize = 5;//每页显示记录条数
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            currentPageNumber = 1;
            ViewState["currentPageNumber"] = currentPageNumber;
            BindData();
        }
        AspNetPager1.PageChanged += new EventHandler(AspNetPager1_PageChanged);  //定义控件分页事件
    }
  
    //获取记录总数
    private int GetCount()
    {
        string sql = "select COUNT(*) from T_Test";
        DataTable dt = GetTable(sql, CommandType.Text, values);
        if (dt.Rows.Count > 0)
        {
            return Convert.ToInt32(dt.Rows[0][0]);
        }
        else
        {
            return 0;
        }
    }
      
    //绑定数据
    private void BindData()
    {
        ltlCount.Text = GetCount().ToString();
        currentPageNumber = Convert.ToInt32(ViewState["currentPageNumber"]);
        SqlParameter[] values = { new SqlParameter("@PageNumber", currentPageNumber), new SqlParameter("@PageSize", pageSize) };
         
        DataTable dt = GetTable("P_Pager", CommandType.StoredProcedure, values);  //调用存储过程
        if (dt.Rows.Count > 0)
        {
            AspNetPager1.PageSize = pageSize;
            AspNetPager1.RecordCount = GetCount();
            AspNetPager1.CurrentPageIndex = currentPageNumber;
            this.Repeater1.DataSource = dt.DefaultView;
            this.Repeater1.DataBind();
        }
    }
  
    //分页事件   
    void AspNetPager1_PageChanged(object sender, EventArgs e)
    {
        currentPageNumber = AspNetPager1.CurrentPageIndex;
        ViewState["currentPageNumber"] = currentPageNumber;
        BindData();
    }
      
     // 读取存储过程返回table
    private DataTable GetTable(string sql, CommandType t, params SqlParameter[] values)
    {
        using (SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=testDB;Persist Security Info=True;User ID=sa;Password=123456"))
        {
            SqlCommand comm = new SqlCommand(sql, conn);
            comm.CommandType = t;
            if (values != null && values.Length > 0)
                comm.Parameters.AddRange(values);
            SqlDataAdapter da = new SqlDataAdapter(comm);
            DataSet ds = new DataSet();
            try
            {
                conn.Open();
                da.Fill(ds);
                return ds.Tables[0];
            }
            catch (Exception)
            {
                return null;
            }
            finally
            {
                conn.Close();
                conn.Dispose();
            }
        }
    }
}







作者: ren1015    时间: 2012-6-13 14:49
datagridview的性能低占内存,尤其有很多页的时候,所以建议自己编程实现
作者: 朱永恒    时间: 2012-6-17 00:31
也可用listview来实现分页,但要效率还是要重写分页。
作者: 鲍云龙    时间: 2012-6-23 09:19
可以用服务器端的控件来实现,但是效率低。也可以自己写。原理很简单。就是每次查出一页数据显示在页面上。
sql语句可以这么写
SELECT TOP 页大小 *
FROM table1
WHERE id NOT IN
          (
          SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
          )
ORDER BY id

还有无刷新分页,用ajax实现。
作者: 程艳伟    时间: 2012-7-2 11:24
你们都理解错了吧,他说的是把长长的文章分页,比如这个文章有10000字每页显示2000字,分5页,你们怎么都在说查询分页,http://www.cnblogs.com/olay2008/articles/978890.html,这个对你有用




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2