您的位置:首页 > 编程语言 > ASP

ASP.NET分页探索之一:使用PagedDataSource控件

2020-03-01 09:52 573 查看

为了将大量的数据分为多页显示,提高用户浏览体验,我们经常需要对数据进行分页。DataGrid就具有分页功能,而要让DataList和DataRepeater具备类似功能,我们能够使用的最直接、快速的方法是利用PageDataSource控件。在数据进行分页的时候还需要对数据页索引做一个导航,类似于“首页 上一页 下一页 末页”或者“1 2 3 4 5 6 7 8 9 10 ……”,在这个例子中创建了一个类,它封装了一个PagedDataSource控件和输出的数据索引导航条。下面是其实现:

创建PagedDataSourceExtension类:PagedDataSourceExtension.cs
Code
  1 using System;
  2 using System.Data;
  3 using System.Data.OleDb;
  4 using System.Data.SqlClient;
  5 using System.Web;
  6 using System.Web.Security;
  7 using System.Web.UI;
  8 using System.Web.UI.WebControls;
  9 using System.Text;
 10
 11 /**//// <summary>
 12 ///PagedDataSourceExtension 的摘要说明
 13 /// </summary>
 14 public class PagedDataSourceExtension
 15 {
 16     /**//// <summary>
 17     /// 分页参数的查询字符串
 18     /// </summary>
 19     private string queryStringName = "pageIndex";
 20     /**//// <summary>
 21     /// 设置或获取分页参数的查询字符串
 22     /// </summary>
 23     public string QueryStringName
 24      {
 25         get  { return this.queryStringName; }
 26         set  { this.queryStringName = value; }
 27
 28     }
 29     /**//// <summary>
 30     /// 数据存储组件
 31     /// </summary>
 32     private PagedDataSource ps;
 33     /**//// <summary>
 34     /// 分页索引文本
 35     /// </summary>
 36     private String pagerText;
 37     /**//// <summary>
 38     /// 以每页记录大小为参数构造一个实例
 39     /// </summary>
 40     /// <param name="pSize"></param>
 41     public PagedDataSourceExtension(int pSize)
 42      {
 43         ps = new PagedDataSource();
 44         ps.AllowPaging = true;
 45         ps.PageSize = pSize;
 46     }
 47     /**//// <summary>
 48     /// 获取从查询字符串中得来的页数索引,默认为1
 49     /// </summary>
 50     int curIndex
 51      {
 52         get
 53          {
 54             HttpContext ctx = HttpContext.Current;
 55             int index = 1;
 56             if (ctx.Request.Params[this.queryStringName] != null)
 57                 int.TryParse(ctx.Request.Params[this.queryStringName], out index);
 58             if (index == 0)
 59                 index = 1;
 60             return index;
 61         }
 62     }
 63     /**//// <summary>
 64     /// 为数据消费者提供数据
 65     /// </summary>
 66     public PagedDataSource Data
 67      {
 68         get  { return ps; }
 69     }
 70     /**//// <summary>
 71     /// 获取分页索引文本作为导航
 72     /// </summary>
 73     public String PagerText
 74      {
 75         get  { return pagerText; }
 76     }
 77     /**//// <summary>
 78     /// 给PagedDataSource填充数据
 79     /// </summary>
 80     /// <param name="ds">DataSet参数</param>
 81     public void FillData(DataSet ds)
 82      {
 83         ps.DataSource = ds.Tables[0].DefaultView;
 84         if (this.curIndex >= ps.PageCount) ps.CurrentPageIndex = ps.PageCount - 1;
 85         else if (curIndex <= 0) ps.CurrentPageIndex = 0;
 86         else ps.CurrentPageIndex = curIndex;
 87         CreatePagerText();
 88     }
 89     /**//// <summary>
 90     ///  给PagedDataSource填充数据
 91     /// </summary>
 92     /// <param name="sql">Select语句</param>
 93     /// <param name="connstr">连接字符串</param>
 94     public void FillData(string sql, string connstr)
 95      {
 96         IDataAdapter ida;
 97         if (connstr.ToLower().Contains("jet") || connstr.ToLower().Contains("provider"))
 98
 99             ida = new OleDbDataAdapter(sql, connstr);
100         else
101             ida = new SqlDataAdapter(sql, connstr);
102         DataSet ds = new DataSet();
103         ida.Fill(ds);
104         ps.DataSource = ds.Tables[0].DefaultView;
105         if (curIndex >= ps.PageCount) ps.CurrentPageIndex = ps.PageCount - 1;
106         else if (curIndex <= 0) ps.CurrentPageIndex = 0;
107         else ps.CurrentPageIndex = curIndex - 1;
108         CreatePagerText();
109
110     }
111     /**//// <summary>
112     /// 生成导航文本
113     /// </summary>
114     void CreatePagerText()
115      {
116         StringBuilder sb = new StringBuilder();
117         int startPage = this.curIndex / 10;
118         startPage = (this.curIndex % 10 == 0) ? startPage - 1 : startPage;
119         if (startPage > 0)
120          {
121             for (int j = 0; j < startPage; j++)
122              {
123                 sb.Append(string.Format("<a href='?{1}={0}' title='第{0}页'>{0}</a>&nbsp;&nbsp;", j * 10 + 1, this.queryStringName));
124             }
125         }
126
127         if (this.curIndex > 10 * startPage && this.curIndex > 10)
128             sb.Append(string.Format("<a title='第{0}页' href='?{1}={0}'> </a>&nbsp;&nbsp;", startPage * 10, this.queryStringName));
129
130         for (int i = startPage * 10 + 1; i <= ps.PageCount; i++)
131          {
132
133             if (i <= startPage * 10 + 10 || i == ps.PageCount)
134              {
135                 if (i == this.curIndex)
136                     sb.Append(string.Format("<a href='?{1}={0}' title='第{0}页'><b><u>{0}</u></b></a>&nbsp;&nbsp;", i, this.queryStringName));
137                 else
138                     sb.Append(string.Format("<a href='?{1}={0}' title='第{0}页'>{0}</a>&nbsp;&nbsp;", i, this.queryStringName));
139             }
140             else if (i == startPage * 10 + 11)
141                 sb.Append(string.Format("<a href='?{1}={0}' title='第{0}页'> </a>&nbsp;", i, this.queryStringName));
142         }
143
144         pagerText = sb.ToString();
145
146     }
147 }

 

PageDataSourceExtension从一个包含每页记录数的Int创建实例,并从一个已有的DataSet对象或者一个SELECT语句和ConnectionString获取数据。其Data属性返回PagedDataSource对象供数据消费者使用,而PagerText属性则返回为数据消费者创建的导航文本。

后台使用方法为:

 

Code
    protected void Page_Load(object sender, EventArgs e)
    {
        PagedDataSourceExtension pdse = new PagedDataSourceExtension(2);
        pdse.FillData("select * from products","Provider=Microsoft.Jet.OleDb.4.0;Data Source="+Request.MapPath("app_data\\ebiz.mdb"));
        this.PagerNav.Text = pdse.PagerText;
        this.DataList1.DataSource = pdse.Data;
        this.DataList1.DataBind();        
       
    }

 

使用效果:


 

双导航条显示:

 

使用PagedDataSource控件进行分页并不是理想的方案,特别是在数据量大的时候非常不经济。因为该控件是每次访问页面是都使用全部的数据,而高效的分页应该是用多少数据取多少数据。

 

转载于:https://www.cnblogs.com/jf_dai/archive/2009/11/22/1605651.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
aecte40684 发布了0 篇原创文章 · 获赞 0 · 访问量 19 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: