用DataReader实现分页,让我头疼了好多天。为什么我非的用DataReader控件实现分页呢?大家看看( http://www.wrclub.net/mb/ )这个页面,也许有点明白了吧!对数据的横竖排列我们可以随意控制!
ASP.net中,最容易完成分页操作的是DataGrid,其次是DataList控件;但它们对数据的显示却做了限制,使得数据显示变得很难操作。DataReader模拟快速、仅向前的只读游标的操作,完成分页根本不可能,针对DataReader实现分页也只能从sql语句分析,但它对数据显示完全自由,我们可以根据自己的意愿来定义数据的显示方式!
代码如下:
1@ Page Language="C#" Debug="true"
1@OutputCache Duration="3" VaryByParam="none"
1@Import Namespace="System.Data"
1@Import Namespace="System.Data.SqlClient"
1<script language="C#" runat="server">
2//以下源码由网人俱乐部提供,作者:福星,网址:http://www.wrclub.net/
3//转摘请注明出处和作者
4//定义每页显示记录数
5int PageSize=9;
6SqlConnection conn;
7void Page_Load(Object src,EventArgs e)
8{
9int RecordCount,PageCount,CurrentPage,startID,endID;
10//建立与数据库的连接
11conn =new SqlConnection(ConfigurationSettings.AppSettings["strconn"]);
12conn.Open();
13//第一次请求执行
14if(!Page.IsPostBack)
15{
16//计算总共有多少记录
17RecordCount = CalculateRecord();
18//计算总共有多少页
19//取整
20PageCount = RecordCount/PageSize;
21if (RecordCount%PageSize > 0)
22PageCount = PageCount + 1;
23lblPageCount.Text = PageCount.ToString();
24lblRecordCount.Text = RecordCount.ToString();
25CurrentPage = 0;
26}
27//定义一个临时变量
28string startIDt,endIDt;
29//设置下一页开始ID
30startID=0;
31//设置上一页结束ID
32endID=0;
33startIDt=Request.Params["sid"];
34endIDt=Request.Params["eid"];
35//获得下一页开始ID
36if(startIDt!=null)
37startID=Convert.ToInt32(startIDt);
38//获得上一页结束ID
39if(endIDt!=null)
40endID=Convert.ToInt32(endIDt);
41//sql语句开始部分
42string ConnStr="select top "+PageSize+" * from article where classid=1 ";
43//如果有下一页开始ID的值,说明点击了“下一页”,条件语句查询的ID小于开始ID(这里排序为ID倒序)
44if(startID>0)
45ConnStr+=" and id<"+startID;
46//如果有上一页结束ID的值,说明点击了“上一页”,条件语句查询的ID大于结束ID(这里排序为ID倒序)
47if(endID>0)
48ConnStr+=" and id>"+endID;
49//ID倒序
50ConnStr+=" order by id desc";
51//DataReader执行以上sql语句
52SqlCommand cmd=new SqlCommand(ConnStr,conn);
53SqlDataReader myReader = cmd.ExecuteReader();
54string html="<table border='0' cellpadding='0' cellspacing='0' style='border-collapse: collapse' bordercolor='#111111' width='100%' height='139' bgcolor='#ffffff'><tr>";
55int i=0;
56while(myReader.Read())
57{
58//获得上一页结束ID值
59if(i==0)endID=Convert.ToInt32(myReader[0]);
60html+="<td align=center height=180 ><table border='0' cellpadding='0' cellspacing='0' style='border-collapse: collapse' bordercolor='#111111' width='145'><tr><td align=center><img src='"+myReader[2].ToString().Trim()+"/"+myReader[3].ToString().Trim()+"' height=143 width=140 border=0 alt='"+myReader[1].ToString().Trim()+"'></td></tr><tr><td width='100%' background='images/mbbg.gif'><table border='0'cellpadding='0'cellspacing='0'width='100%'><tr><td width='50%'><a href='"+myReader[2].ToString().Trim()+"/' target='_blank'><img src='images/view.gif' border=0></a></td><td width='50%' align=right><a href='mbdown.aspx?id="+myReader[0]+"' target=_blank><img src='images/down.gif' border=0></a></td></tr></table></td></tr></table></td>";
61i++;
62if(i%3==0)
63html+="</tr><tr>";
64//获得下一页开始ID值
65if(i==PageSize)startID=Convert.ToInt32(myReader[0]);
66}
67myReader.Close();
68html+="</tr></table>";
69mblist.InnerHtml=html;
70
71//获得页的值
72if(Request.Params["page"]!=null)
73CurrentPage = Convert.ToInt32(Request.Params["page"]);
74if(PageCount==0)
75{
76lblCurrentPage.Text = "0";
77pagelist.InnerHtml="上一页 下一页";
78}
79else
80{
81lblCurrentPage.Text = CurrentPage.ToString();
82pagelist.InnerHtml="<a href='http://www.wrclub.net/mblist.aspx?id=22&classname=模板中心&page="+(CurrentPage-1)+"&eID="+endID+"'>上一页</a> <a href='http://www.wrclub.net/mblist.aspx?id=22&classname=模板中心&page="+(CurrentPage+1)+"&sID="+startID+"'>下一页</a>";
83if(CurrentPage==PageCount)
84pagelist.InnerHtml="<a href='http://www.wrclub.net/mblist.aspx?id=22&classname=模板中心&page="+(CurrentPage-1)+"&eID="+endID+"'>上一页</a> 下一页";
85if(CurrentPage==0)
86{
87pagelist.InnerHtml="上一页 <a href='http://www.wrclub.net/mblist.aspx?id=22&classname=模板中心&page="+(CurrentPage+2)+"&sID="+startID+"'>下一页</a>";
88lblCurrentPage.Text = (CurrentPage+1).ToString();
89}
90}
91}
92//获得记录总数
93public int CalculateRecord()
94{
95int intCount;
96string strCount = "select count(*) from article where classid=1";
97SqlCommand MyComm = new SqlCommand(strCount,conn);
98SqlDataReader dr = MyComm.ExecuteReader();
99if(dr.Read())
100{
101intCount = Int32.Parse(dr[0].ToString());
102}
103else
104{
105intCount = 0;
106}
107dr.Close();
108return intCount;
109}
110</script>
1<html>
2<head>
3<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
4<title>模板中心:网人俱乐部</title>
5<meta content="学习,免费资源,asp,jsp,flash,photoshop,社区,论坛,同学录,电子图书,网站建设,宣传,推广,聊天,数据库,经验心得,游戏,game,电子超市,网人交流论坛,插件,下载" name="Keywords"/>
6<meta content="提供网站建设、开发方面的学习资料、经验心得,同时提供免费的电子书籍、网站免费资源、制作工具、插件、滤镜,网站还有网上电子超市、论坛、网人交流论坛" name="description"/>
7<link href="style.css" rel="stylesheet" type="text/css"/><link href="favicon.ico" rel="Shortcut Icon"/>
8</head>
9<body leftmargin="0" topmargin="0"><form runat="server">
10<!-- #Include File="top.inc" -->
11<table bgcolor="#D8D8D8" border="0" cellpadding="0" cellspacing="0" width="778">
12<tr>
13<td align="center" height="400" valign="top" width="562"><br/>
14<!-- 数据显示位置 -->
15<span id="mblist" runat="server"></span>
16<table bgcolor="#FFFFFF" border="0" cellpadding="0" cellspacing="0" width="100%">
17<tr>
18<td align="center">共有<asp:label forecolor="red" id="lblRecordCount" runat="server"></asp:label>条记录
19当前为<asp:label forecolor="red" id="lblCurrentPage" runat="server"></asp:label>/<asp:label forecolor="red" id="lblPageCount" runat="server"></asp:label>页 </td>
20<td align="center">
21<!-- 分页显示位置 -->
22<span id="pagelist" runat="server"></span>
23</td>
24</tr>
25</table>
26</td></tr></table>
27</form>
28</body></html>
注明:下一页开始ID值为最接近下一页开始ID值,上一页结束ID为最接近上一页结束ID。我这个写的相对实现了数据的自定义显示,对于分页功能还不是很强大,大家可以在此基础上增加功能。