当前位置:编程学习 > C#/ASP.NET >>

ASP.NET分页的常用方法有哪些

【考点】
ASP.NET分页方法的了解程度
【出现频率】
★★★★☆
【解答】
ASP.NET分页的常用方法有以下几种。
q      启用部分数据控件的内置分页功能,如设置GridView控件的“AllowPaging”属性为“true”,类似的数据控件还有DetailsView等。
q      通过SQL查询语句,以提取指定部分的数据的方式完成分页的功能。也包括调用数据库中内置的存储过程完成分页数据的提取。
q      调用所对应数据适配器对象(DataAdapter对象)的Fill方法时,传递分页参数以完成数据集的分页功能。
q      通过访问DataTable对象的“Rows”属性,以循环输出的方式访问结果集中指定区段的数据行,以达到分页的效果。
【分析】
分页功能在大部分WEB项目中使用比较广泛,本题考查面试者对ASP.NET中可用分页方法的了解程度。在页面布局等方面要求不高的情况下,例如WEB后台管理系统,使用数据控件内置的分页功能通常是编程者的首选。为了展示常用的这四种分页方法,笔者制作一个实例,在同一个页面中分别用这四种方法对相同的结果集分页显示。在VS 2008中添加新的WEB窗体到NetWeb3项目,并命名为Pager.aspx。在页面中添加1个GridView控件,用于展示内置分页功能,添加2个Repeater控件,用于展示SQL语句分页和数据适配器对象分页。最后通过在Pager.aspx页面导入System.Data命名空间,在页面中直接用for循环输出dt数据表的指定数量记录,以完成分页显示的效果。编写Pager.aspx如代码12.12所示。

代码12.12  多种方法分页显示页面:Pager.aspx

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>四种分页方法实例</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <h3>控件内置分页【每页3条记录】</h3>
      <asp:GridView runat="server" ID="GView" AllowPaging="true" PageSize="3"></asp:GridView>
      <h3>数据适配器分页【当前显示第1页,每页2条记录】</h3>
      <asp:Repeater runat="server" ID="Rp1" >
              <HeaderTemplate><ul></HeaderTemplate>
              <ItemTemplate>
                <li><asp:Label runat="server" ID="UName" Text='<%# Eval("UserName") %>'></asp:Label>:<asp:Label runat="server" ID="Msg" Text='<%# Eval("Message") %>'></asp:Label></li>
              </ItemTemplate>
              <FooterTemplate></ul></FooterTemplate>
       </asp:Repeater>
       <h3>SQL分页【当前显示第2页,每页3条记录】</h3>
       <asp:Repeater runat="server" ID="Rp2" >
              <HeaderTemplate><ul></HeaderTemplate>
              <ItemTemplate>
                <li><asp:Label runat="server" ID="UName" Text='<%# Eval("UserName") %>'></asp:Label>:<asp:Label runat="server" ID="Msg" Text='<%# Eval("Message") %>'></asp:Label></li>
              </ItemTemplate>
              <FooterTemplate></ul></FooterTemplate>
       </asp:Repeater>
       <h3>数据表分页【当前显示第1页,每页3条记录】</h3>
       <%
          Response.Write("<ul>");
          int i;
          string UName;
          string Msg;
          for(i=0;i<3;i++)
          {
              UName = dt.Rows[i][0].ToString();
              Msg = dt.Rows[i][1].ToString();
              Response.Write(String.Format("<li>{0}:{1}</li>",UName,Msg));
          }
          Response.Write("</ul>");          
        %>
    </div>
    </form>
</body>
</html>
编写Pager.aspx.cs如代码12.13所示。

代码12.13  多种方法分页逻辑代码:Pager.aspx.cs

using System;
………………………………
//导入必要的命名空间,使用SQL SERVER数据提供者
using System.Data.SqlClient;
 
namespace NetWeb3
{
    public partial class Pager : System.Web.UI.Page
    {
        //从Web.config的AppSettings节点的第1个子节点中获取数据库连接字符串
        //将连接字符串对象引用赋值给静态字符串变量CnStr
        static string CnStr = ConfigurationManager.AppSettings[0];
        //根据CnStr变量创建SqlConnection对象,引用为cn
        SqlConnection cn = new SqlConnection(CnStr);
        //声明SqlDataAdapter类型变量da
        SqlDataAdapter da;
        //创建DataSet对象,引用为ds
        DataSet ds = new DataSet();
        //声明DataTable类型的变量dt
        //protected修饰符可以保证在*.aspx中可以访问dt
        protected DataTable dt;
 
        protected void Page_Load(object sender, EventArgs e)
        {
            this.GView.PageIndexChanging += new GridViewPageEventHandler(GView_PageIndexChanging);
            //判断页面是否为首次加载
            if (!IsPostBack)
            {           
                //调用自定义的MyBind方法
                MyBind();
            }
        }
 
        protected void MyBind()
        {
            string SqlStr = "SELECT [UserName],[Message] FROM [LeaveMsg]";
            //根据SqlStr和cn创建新的SqlDataAdapter对象,引用为da变量
            da = new SqlDataAdapter(SqlStr, cn);
            //调用da的Fill方法,将记录填充到ds,其DataTable名称为LeaveMsg1
            da.Fill(ds, "LeaveMsg1");
            //将LeaveMsg1数据表设置为GView控件的数据源
            this.GView.DataSource = ds.Tables["LeaveMsg1"];
 
            //调用da的Fill方法,将记录填充到ds,其DataTable名称为LeaveMsg2
            //Fill方法接收的第2个参数代表从第几条记录开始填充,第3个参数代表填充多少条记录
            da.Fill(ds,0,2, "LeaveMsg2");
            //将LeaveMsg1数据表设置为Rp1控件的数据源
            this.Rp1.DataSource = ds.Tables["LeaveMsg2"].DefaultView;           
 
            cn.Open();
            //编写SQL语句,直接在数据库查询时分页获取数据
            SqlStr = "Select Top 3 [UserName],[Message] from [LeaveMsg] where [id] Not IN (Select Top (3*1) [id] from [LeaveMsg])";
            //根据SqlStr和cn创建新的SqlCommand对象,引用为cmd变量
            SqlCommand cmd = new SqlCommand(SqlStr, cn);
            //调用cmd的ExecuteReader方法,返回数据读取器,引用为dr
            SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            //将dr设置为Rp2控件的数据源
            this.Rp2.DataSource = dr;
            //将LeaveMsg1数据表对象引用赋值给dt,供*.aspx中访问
            dt = ds.Tables["LeaveMsg1"];
            //绑定页面所有控件的数据
            this.DataBind();
            //关闭数据读取器,同时关闭数据库连接
            dr.Close();
        }
 
        //该方法为GView控件的数据页索引变化事件的处理方法
        protected void GView_PageIndexChanging(object sender, GridViewPageEventArgs e)  
        {
            //设置新的页索引
            GView.PageIndex = e.NewPageIndex;
            //再次调用MyBind方法,绑定页面数据
            MyBind();
        }
    }
}
打开IE浏览器,在浏览器地址栏输入“http://localhost/Pager.aspx”,页面运行效果如图12.5所示。

图12.5  多种分页方法的展示

--------------------编程问答-------------------- 用 top  分页 --------------------编程问答-------------------- row_number()  top max --------------------编程问答-------------------- 学习~~ --------------------编程问答-------------------- row_number() 加 aspnetpager控件 --------------------编程问答-------------------- 自己动手用linkbutton写,或者用aspnet易做图控件做,后者比较简单。 --------------------编程问答-------------------- 数据量大的话必须考虑数据分页 --------------------编程问答-------------------- 恩 学习了 --------------------编程问答-------------------- 这两天都在折腾这个问题. 
楼上好几个人提到了AspNetPager控件, 到底是指哪个?  --------------------编程问答-------------------- 那个AspNetPager是个第三方空间,免费的,网上找去吧。 --------------------编程问答--------------------
引用 9 楼 gengchenhui 的回复:
那个AspNetPager是个第三方空间,免费的,网上找去吧。

+1 --------------------编程问答-------------------- 我也正在做分页,考虑怎么分页,汗,有好的方法吗/ --------------------编程问答-------------------- 收藏了 --------------------编程问答-------------------- skip().take() + aspnetpager --------------------编程问答--------------------
public  static string pagination(int total, int per, int page, string query_string)
    {
        int allpage = 0;
        int next = 0;
        int pre = 0;
        int startcount = 0;
        int endcount = 0;
        string pagestr = "";

        if (page < 1) { page = 1; }
        //计算总页数
        if (per != 0)
        {
            allpage = (total / per);
            allpage = ((total % per) != 0 ? allpage + 1 : allpage);
            allpage = (allpage == 0 ? 1 : allpage);
        }

        next = page + 1;
        pre = page - 1;
        startcount = (page + 5) > allpage ? allpage - 9 : page - 4;//中间页起始序号
        //中间页终止序号
        endcount = page < 5 ? 10 : page + 5;
        if (startcount < 1) { startcount = 1; } //为了避免输出的时候产生负数,设置如果小于1就从序号1开始
        if (allpage < endcount) { endcount = allpage; }//页码+5的可能性就会产生最终输出序号大于总页码,那么就要将其控制在页码数之内
        pagestr = "共" + allpage + "页      ";

        pagestr += page > 1 ? "<a href=\"" + query_string + "?page=1\">首页</a>  <a href=\"" + query_string + "?page=" + pre + "\">上一页</a>" : "首页 上一页";
        //中间页处理,这个增加时间复杂度,减小空间复杂度
        for (int i = startcount; i <= endcount; i++)
        {
            pagestr += page == i ? "  <font color=\"#ff0000\">" + i + "</font>" : "  <a href=\"" + query_string + "?page=" + i + "\">" + i + "</a>";
        }
        pagestr += page != allpage ? "  <a href=\"" + query_string + "?page=" + next + "\">下一页</a>  <a href=\"" + query_string + "?page=" + allpage + "\">末页</a>" : " 下一页 末页";


        pagestr += "  <select onchange=\"javascript:window.location=this.value\" >";

        for (int i = 1; i <= allpage; i++)
        {
            if (i == page)
            {
                pagestr += "<option  value=\"" + query_string + "?page=" + i + "\" selected>第" + i + "页</option>";
            }
            else
            {
                pagestr += "<option  value=\"" + query_string + "?page=" +i + "\" >第" + i + "页</option>";
            }
        }
        pagestr += "</select>";


        return pagestr;
    }
--------------------编程问答--------------------
引用 13 楼 michael_ls 的回复:
skip().take() + aspnetpager
忘了说明了 /// <param name="total">总记录数</param>
    /// <param name="per">每页记录数</param>
    /// <param name="page">当前页数</param>
    /// <param name="query_string">Url参数</param> --------------------编程问答--------------------
引用 14 楼 dengqingqing2008 的回复:
C# code
public  static string pagination(int total, int per, int page, string query_string)
    {
        int allpage = 0;
        int next = 0;
        int pre = 0;
        int startcount = 0;
……

忘了说明了 /// <param name="total">总记录数</param>
  /// <param name="per">每页记录数</param>
  /// <param name="page">当前页数</param>
  /// <param name="query_string">Url参数</param> --------------------编程问答-------------------- 有哪位大虾有一个完整的分页实例啊? --------------------编程问答-------------------- 图没有显示出来啊!!! --------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- 不知gridview+AspNetPager这个组合如何?
补充:.NET技术 ,  非技术区
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,