DataReader也玩超酷数据显示分页

用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。我这个写的相对实现了数据的自定义显示,对于分页功能还不是很强大,大家可以在此基础上增加功能。

源出处: http://www.wrclub.net/study/listarticle.aspx?id=1157

Published At
Categories with Web编程
Tagged with
comments powered by Disqus