DataList控件也玩分頁 (轉自aspcn.com)
2024-05-04 11:06:34
供稿:網友
本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。眾所周知,asp.net中給我們提供了三個數據控件--datagrid,repeater,datalist。在這三個控件中,datagrid控件的功能最強大,repeater控件最忠實于模版原樣,datalist控件則兼而有之。
datagrid控件太有名了,所以以前用的講的也很多,repeater功能太少,沒有什么好講的。這里主要是講一講datalist控件。
datalist控件其實功能也很強大,他支持選擇、編輯,實現的方法也很簡單,不過最令人頭疼的就是它不像datagrid控件一樣內置了分頁的功能,這么好的一個控件竟然不能分頁!?。?br>
確實是一個很讓人頭疼的事情。
不過,只是datalist沒有提供內置的分頁功能,但是并不表示,我們不能使用datalist控件來實現分頁,既然它不給我分頁功能,那只好自己動手了。
下面是全部原代碼,其實用到的方法和php中的分頁差不多,只是這里用的是dataadapter與dataset組合,而不是php中的sql語句直接搞定。
(本程序在.net framework beta 2下測試通過)
<% @ page language="c#" %>
<% @ import namespace="system.data" %>
<% @ import namespace="system.data.oledb" %>
<script language="c#" runat="server">
/*
create by 飛刀
http://www.aspcn.com
2001-7-25 01:44
support .net framework beta 2
*/
oledbconnection myconn;
int pagesize,recordcount,pagecount,currentpage;
public void page_load(object src,eventargs e)
{
//設定pagesize
pagesize = 10;
//連接語句
string myconnstring = "provider=microsoft.jet.oledb.4.0; data source="+server.mappath(".")+"..//database//db1.mdb;";
myconn = new oledbconnection(myconnstring);
myconn.open();
//第一次請求執行
if(!page.ispostback)
{
listbind();
currentpage = 0;
viewstate["pageindex"] = 0;
//計算總共有多少記錄
recordcount = calculaterecord();
lblrecordcount.text = recordcount.tostring();
//計算總共有多少頁
pagecount = recordcount/pagesize;
lblpagecount.text = pagecount.tostring();
viewstate["pagecount"] = pagecount;
}
}
//計算總共有多少條記錄
public int calculaterecord()
{
int intcount;
string strcount = "select count(*) as co from score";
oledbcommand mycomm = new oledbcommand(strcount,myconn);
oledbdatareader dr = mycomm.executereader();
if(dr.read())
{
intcount = int32.parse(dr["co"].tostring());
}
else
{
intcount = 0;
}
dr.close();
return intcount;
}
icollection createsource()
{
int startindex;
//設定導入的起終地址
startindex = currentpage*pagesize;
string strsel = "select * from score";
dataset ds = new dataset();
oledbdataadapter myadapter = new oledbdataadapter(strsel,myconn);
myadapter.fill(ds,startindex,pagesize,"score");
return ds.tables["score"].defaultview;
}
public void listbind()
{
score.datasource = createsource();
score.databind();
lbnnextpage.enabled = true;
lbnprevpage.enabled = true;
if(currentpage==(pagecount-1)) lbnnextpage.enabled = false;
if(currentpage==0) lbnprevpage.enabled = false;
lblcurrentpage.text = (currentpage+1).tostring();
}
public void page_onclick(object sender,commandeventargs e)
{
currentpage = (int)viewstate["pageindex"];
pagecount = (int)viewstate["pagecount"];
string cmd = e.commandname;
//判斷cmd,以判定翻頁方向
switch(cmd)
{
case "next":
if(currentpage<(pagecount-1)) currentpage++;
break;
case "prev":
if(currentpage>0) currentpage--;
break;
}
viewstate["pageindex"] = currentpage;
listbind();
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<form runat="server">
共有<asp:label id="lblrecordcount" forecolor="red" runat="server" />條記錄
當前為<asp:label id="lblcurrentpage" forecolor="red" runat="server" />/<asp:label id="lblpagecount" forecolor="red" runat="server" />頁
<asp:datalist id="score" runat="server"
headerstyle-backcolor="#aaaadd"
alternatingitemstyle-backcolor="gainsboro"
edititemstyle-backcolor="yellow"
>
<itemtemplate>
姓名:<%# databinder.eval(container.dataitem,"name") %>
<asp:linkbutton id="btnselect" text="編輯" commandname="edit" runat="server" />
</itemtemplate>
</asp:datalist>
<asp:linkbutton id="lbnprevpage" text="上一頁" commandname="prev" oncommand="page_onclick" runat="server" />
<asp:linkbutton id="lbnnextpage" text="下一頁" commandname="next" oncommand="page_onclick" runat="server" />
</form>
</body>
</html>
運行結果如上圖:)
大家在寫程序時,最重要的是自己去動腦去想,決對不是一出現問題去哪去問。問題太簡單了,還沒有人愿意回答。
多多思考,多多查資料,才是真正有收獲的。