ASP.NET分页探索之一:使用PagedDataSource控件
为了将大量的数据分为多页显示,提高用户浏览体验,我们经常需要对数据进行分页。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> ", 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> ", 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> ", i, this.queryStringName));
137
else
138
sb.Append(string.Format("<a href='?{1}={0}' title='第{0}页'>{0}</a> ", i, this.queryStringName));
139
}
140
else if (i == startPage * 10 + 11)
141
sb.Append(string.Format("<a href='?{1}={0}' title='第{0}页'>
</a> ", 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
- 点赞
- 收藏
- 分享
- 文章举报
- 在asp.net mvc中创建使用Linq to sql的分页控件
- 在asp.net mvc中创建使用Linq to sql的分页控件[转]
- asp.net下Repeater使用 AspNetPager分页控件
- asp.net分页控件AspNetPager的使用,使用传统分页和存储过程分页
- ASP.NET 使用DataList控件实现分页显示数据
- asp.net分页控件使用详解【附实例下载】
- Wap页面使用asp.net中移动控件List分页
- asp.net分页控件AspNetPager的使用,使用传统分页和存储过程分页
- Asp.Net分页和AspNetPager控件的使用
- ASP.NET-AspNetPager分页控件完整使用方法
- 我要学ASP.NET MVC 3.0(十九): MVC 3.0 实例之使用开源控件实现表格排序和分页
- asp.net repeater控件使用(自定义coulmn,分页)
- sql分页存储过程!与asp.net分页控件一起使用
- asp.net中使用分页控件,并绑定数据到GridView或Repeater
- asp.net mvc 分页控件 MvcPager修改;使用范围增大
- ASP.NET-AspNetPager分页控件完整使用方法
- 使用ASP.NETAtlasPageNavigator控件实现客户端分页导航
- ASP.NET使用AspNetPager控件实现真分页
- ASP.NET使用ListView数据绑定控件和DataPager实现数据分页显示(二)
- 刀剑无影——使用ObjectDataSource控件在ASP.NET中实现Ajax真分页