DataReader也玩超酷数据显示分页
2024-07-21 02:23:51
供稿:网友
用datareader实现分页,让我头疼了好多天。为什么我非的用datareader控件实现分页呢?大家看看(http://www.wrclub.net/mb/)这个页面,也许有点明白了吧!对数据的横竖排列我们可以随意控制!
asp.net中,最容易完成分页操作的是datagrid,其次是datalist控件;但它们对数据的显示却做了限制,使得数据显示变得很难操作。datareader模拟快速、仅向前的只读游标的操作,完成分页根本不可能,针对datareader实现分页也只能从sql语句分析,但它对数据显示完全自由,我们可以根据自己的意愿来定义数据的显示方式!
代码如下:
<%@ page language="c#" debug="true" %>
<%@outputcache duration="3" varybyparam="none"%>
<%@import namespace="system.data"%>
<%@import namespace="system.data.sqlclient"%>
<script language="c#" runat="server">
//以下源码由网人俱乐部提供,作者:福星,网址:http://www.wrclub.net/
//转摘请注明出处和作者
//定义每页显示记录数
int pagesize=9;
sqlconnection conn;
void page_load(object src,eventargs e)
{
int recordcount,pagecount,currentpage,startid,endid;
//建立与数据库的连接
conn =new sqlconnection(configurationsettings.appsettings["strconn"]);
conn.open();
//第一次请求执行
if(!page.ispostback)
{
//计算总共有多少记录
recordcount = calculaterecord();
//计算总共有多少页
//取整
pagecount = recordcount/pagesize;
if (recordcount%pagesize > 0)
pagecount = pagecount + 1;
lblpagecount.text = pagecount.tostring();
lblrecordcount.text = recordcount.tostring();
currentpage = 0;
}
//定义一个临时变量
string startidt,endidt;
//设置下一页开始id
startid=0;
//设置上一页结束id
endid=0;
startidt=request.params["sid"];
endidt=request.params["eid"];
//获得下一页开始id
if(startidt!=null)
startid=convert.toint32(startidt);
//获得上一页结束id
if(endidt!=null)
endid=convert.toint32(endidt);
//sql语句开始部分
string connstr="select top "+pagesize+" * from article where classid=1 ";
//如果有下一页开始id的值,说明点击了“下一页”,条件语句查询的id小于开始id(这里排序为id倒序)
if(startid>0)
connstr+=" and id<"+startid;
//如果有上一页结束id的值,说明点击了“上一页”,条件语句查询的id大于结束id(这里排序为id倒序)
if(endid>0)
connstr+=" and id>"+endid;
//id倒序
connstr+=" order by id desc";
//datareader执行以上sql语句
sqlcommand cmd=new sqlcommand(connstr,conn);
sqldatareader myreader = cmd.executereader();
string html="<table border='0' cellpadding='0' cellspacing='0' style='border-collapse: collapse' bordercolor='#111111' width='100%' height='139' bgcolor='#ffffff'><tr>";
int i=0;
while(myreader.read())
{
//获得上一页结束id值
if(i==0)endid=convert.toint32(myreader[0]);
html+="<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='http://www.163design.net/n/f/images/view.gif' border=0></a></td><td width='50%' align=right><a href='mbdown.aspx?id="+myreader[0]+"' target=_blank><img src='http://www.163design.net/n/f/images/down.gif' border=0></a></td></tr></table></td></tr></table></td>";
i++;
if(i%3==0)
html+="</tr><tr>";
//获得下一页开始id值
if(i==pagesize)startid=convert.toint32(myreader[0]);
}
myreader.close();
html+="</tr></table>";
mblist.innerhtml=html;
//获得页的值
if(request.params["page"]!=null)
currentpage = convert.toint32(request.params["page"]);
if(pagecount==0)
{
lblcurrentpage.text = "0";
pagelist.innerhtml="上一页 下一页";
}
else
{
lblcurrentpage.text = currentpage.tostring();
pagelist.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>";
if(currentpage==pagecount)
pagelist.innerhtml="<a href='http://www.wrclub.net/mblist.aspx?id=22&classname=模板中心&page="+(currentpage-1)+"&eid="+endid+"'>上一页</a> 下一页";
if(currentpage==0)
{
pagelist.innerhtml="上一页 <a href='http://www.wrclub.net/mblist.aspx?id=22&classname=模板中心&page="+(currentpage+2)+"&sid="+startid+"'>下一页</a>";
lblcurrentpage.text = (currentpage+1).tostring();
}
}
}
//获得记录总数
public int calculaterecord()
{
int intcount;
string strcount = "select count(*) from article where classid=1";
sqlcommand mycomm = new sqlcommand(strcount,conn);
sqldatareader dr = mycomm.executereader();
if(dr.read())
{
intcount = int32.parse(dr[0].tostring());
}
else
{
intcount = 0;
}
dr.close();
return intcount;
}
</script>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<title>模板中心:网人俱乐部</title>
<meta name="keywords" content="学习,免费资源,asp,jsp,flash,photoshop,社区,论坛,同学录,电子图书,网站建设,宣传,推广,聊天,数据库,经验心得,游戏,game,电子超市,网人交流论坛,插件,下载">
<meta name="description" content="提供网站建设、开发方面的学习资料、经验心得,同时提供免费的电子书籍、网站免费资源、制作工具、插件、滤镜,网站还有网上电子超市、论坛、网人交流论坛">
<link rel="stylesheet" type="text/css" href="style.css"><link rel="shortcut icon" href="favicon.ico">
</head>
<body topmargin="0" leftmargin="0"><form runat=server>
<!-- #include file="top.inc" -->
<table width="778" border="0" cellpadding="0" cellspacing="0" bgcolor="#d8d8d8">
<tr>
<td width="562" height="400" align="center" valign="top"><br>
<!-- 数据显示位置 -->
<span id="mblist" runat="server"></span>
<table width="100%" border="0" cellspacing="0" cellpadding="0" bgcolor="#ffffff">
<tr>
<td align=center>共有<asp:label id="lblrecordcount" forecolor="red" runat="server" />条记录
当前为<asp:label id="lblcurrentpage" forecolor="red" runat="server" />/<asp:label id="lblpagecount" forecolor="red" runat="server" />页 </td>
<td align=center>
<!-- 分页显示位置 -->
<span id="pagelist" runat="server"></span>
</td>
</tr>
</table>
</td></tr></table>
</form>
</body></html>
注明:下一页开始id值为最接近下一页开始id值,上一页结束id为最接近上一页结束id。我这个写的相对实现了数据的自定义显示,对于分页功能还不是很强大,大家可以在此基础上增加功能。菜鸟学堂: