DataList控件,這個(gè)控件有很強(qiáng)的擴(kuò)展性,可以自定義的顯示數(shù)據(jù)格式,比較靈活,但是它不支持分頁(yè)。所以就查閱、參考了一些網(wǎng)上了資料,發(fā)現(xiàn)了一個(gè)很便捷的實(shí)現(xiàn)分頁(yè)的方法,主要通過(guò)PageDataSource和Request.CurrentExcutionFilePath來(lái)實(shí)現(xiàn)的。好了,還是通過(guò)實(shí)例來(lái)向大家演示如何使用這兩者來(lái)實(shí)現(xiàn)快捷的分頁(yè)。
首先新建一個(gè)產(chǎn)品表Product,表中有如下字段:
然后我們新建一個(gè)產(chǎn)品展示頁(yè),頁(yè)面布局如下:
<div id=
"zone"
>
<div align=
"right"
>
<a href=
"ShopCart.aspx"
><img src=
"PImages/cart.jpg"
alt=
"我的購(gòu)物車(chē)"
title=
"查看購(gòu)物車(chē)"
/></a>
</div>
<br />
<div style=
"text-align:right"
>
<asp:Button ID=
"btnshowall"
runat=
"server"
Text=
"顯示所有產(chǎn)品"
onclick=
"btnshowall_Click"
/></div>
<br />
<div align=
"center"
style=
"width:1000px"
>
<asp:DataList ID=
"DataList1"
runat=
"server"
RepeatDirection=
"Horizontal"
onitemdatabound=
"DataList1_ItemDataBound"
>
<ItemTemplate>
<div>
<asp:Image ID=
"imgpic"
runat=
"server"
height=
"160px"
width=
"160px"
/>
</div>
<div>
<%#Eval(
"ProductName"
) %>
</div>
<div>
<font color=
"gray"
><s><%#Convert.ToInt32(Eval(
"MarketPrice"
)).ToString(
"c2"
) %></s></font> <br><font color=
"red"
><%#Convert.ToInt32(Eval(
"BuyPrice"
)).ToString(
"c2"
) %></font></div>
<div>
<a href=
'ShopCart.aspx?ID=<%#Eval("ID") %>&ProductNo=<%#Eval("ProductNo") %>'
>
<img src=
"PImages/add.jpg"
alt=
"添加到購(gòu)物車(chē)"
title=
"添加到購(gòu)物車(chē)"
/>
</a>
</div>
</ItemTemplate>
</asp:DataList>
</div>
<br />
<div style=
"text-align:center"
>
<asp:Label ID=
"lbcurrentpage"
runat=
"server"
Text=
""
></asp:Label>/
<asp:Label ID=
"lbcount"
runat=
"server"
Text=
""
></asp:Label>
<asp:HyperLink ID=
"hlfirst"
runat=
"server"
>首頁(yè)</asp:HyperLink>
<asp:HyperLink
ID=
"hfprev"
runat=
"server"
>上頁(yè)</asp:HyperLink>
<asp:HyperLink ID=
"hfnext"
runat=
"server"
>下頁(yè)</asp:HyperLink>
<asp:HyperLink ID=
"hflast"
runat=
"server"
>尾頁(yè)</asp:HyperLink>
</div>
分頁(yè)顯示效果:
接下來(lái)需要我們把在aspx.cs頁(yè)進(jìn)行處理:
首先建一個(gè)函數(shù)實(shí)現(xiàn)頁(yè)面的數(shù)據(jù)綁定、顯示:
public
void
BindShow()
{
PagedDataSource pds =
new
PagedDataSource();
//示例化一個(gè)PageDataSource對(duì)象,這是實(shí)現(xiàn)分頁(yè)的基礎(chǔ)
pds.DataSource = SQLHelper.FillDataTable(
"select * from Products order by ID Desc"
).DefaultView;
//從后臺(tái)讀取數(shù)據(jù),并填充到DataTable里,為pds進(jìn)行賦值
pds.AllowPaging =
true
;
//設(shè)置其屬性為允許分頁(yè)
if
(Request[
"P"
] !=
null
)
//檢測(cè)是否要顯示所有信息,如果是,則設(shè)置pdsdePageSize為信息的總條數(shù),即:顯示所有信息
{
pds.PageSize = ((DataView)pds.DataSource).Table.Rows.Count;
btnshowall.Text =
"單頁(yè)顯示"
;
}
Else
//設(shè)置每頁(yè)顯示信息的條數(shù)
{
pds.PageSize = 5;
btnshowall.Text =
"顯示所有產(chǎn)品!"
;
}
int
currentPage;
//定義局部變量標(biāo)識(shí)當(dāng)前頁(yè)
if
(Request[
"Page"
] !=
null
)
//如果Request.QueryString["Page"]不為空,則標(biāo)記當(dāng)前頁(yè)為Request["Page"]的值,否則設(shè)置為當(dāng)前頁(yè)1,即首頁(yè)
{
currentPage = Convert.ToInt32(Request[
"Page"
]);
}
else
{
currentPage = 1;
}
pds.CurrentPageIndex = currentPage - 1;
//設(shè)置當(dāng)前頁(yè)的索引,因?yàn)轫?yè)的索引是從0開(kāi)始的,所以設(shè)置時(shí)應(yīng)將curentPage-1
lbcurrentpage.Text = currentPage.ToString();
//顯示當(dāng)前頁(yè)
lbcount.Text = pds.PageCount.ToString();
//pds自有屬性PageCount統(tǒng)計(jì)頁(yè)數(shù),顯示總頁(yè)數(shù)
if
(!pds.IsFirstPage)
//判斷是否為首頁(yè),如果是則為aspx頁(yè)的LinkButton"上一頁(yè)",設(shè)置其NavigateUrl為Request.CurrentExecutionFilePath?Page=currentPage-1,即:先獲取當(dāng)前請(qǐng)求虛擬路徑即:ShowProducts.aspx然后再進(jìn)行拼接為其加上QueryString“?Page="Convert.ToInto32(currentPage-1),即獲取上一頁(yè)的數(shù)據(jù),同時(shí)只是LinkButton首頁(yè),的NavigateUrl為當(dāng)前請(qǐng)求虛擬路徑+Page=1;
{
hfprev.NavigateUrl = Request.CurrentExecutionFilePath +
"?Page="
+ Convert.ToInt32(currentPage - 1);
hlfirst.NavigateUrl = Request.CurrentExecutionFilePath +
"?Page=1"
;
}
if
(!pds.IsLastPage)
//判斷是否是尾頁(yè),處理方式和上邊是一樣的
{
hfnext.NavigateUrl = Request.CurrentExecutionFilePath +
"?Page="
+ Convert.ToInt32(currentPage + 1);
hflast.NavigateUrl = Request.CurrentExecutionFilePath +
"?Page="
+ pds.PageCount;
}
DataList1.DataSource = pds;
//為DataList控件賦值,并進(jìn)行綁定
DataList1.DataBind();
}
然后我們需要在Page_load函數(shù)里調(diào)用一下即可:
protected void Page_Load(object sender, EventArgs e)
{
BindShow();
}
除此之外,我們還要注意一點(diǎn)的是,我們還需要在DataList1_ItemDataBound事件里對(duì)顯示圖片的路徑進(jìn)行修飾,因?yàn)槲覀償?shù)據(jù)庫(kù)里存的全都是圖片的名稱,這里要轉(zhuǎn)換為圖片的虛擬路徑
protected
void
DataList1_ItemDataBound(
object
sender, DataListItemEventArgs e)
{
if
(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)<br>
//判斷當(dāng)前行的類型是否,是否為交替行,ListItemType是一個(gè)枚舉類型用來(lái)表示當(dāng)前行的類型,<br>有Item,AlternatingItem、Footer(表頭)Header(表尾),Pager,SelectedItem,Separator等枚舉項(xiàng)
{
DataRowView drv = (DataRowView)e.Item.DataItem;
//DataRowView為當(dāng)前自定義的數(shù)據(jù)視圖,可以通過(guò)drv["索引"]的方式來(lái)訪問(wèn)到當(dāng)前行的值
((Image)e.Item.FindControl(
"imgpic"
)).ImageUrl =
"~/PImages/"
+ drv[
"PicturePath"
];<br>
//通過(guò)e.Item.FindControl(控件id)的方式來(lái)獲取aspx頁(yè)的當(dāng)前行的控件,并為其ImageUrl屬性賦值,
}
}
到這里你已經(jīng)實(shí)現(xiàn)了DataList的分頁(yè),快來(lái)試一下吧。
有細(xì)心的朋友發(fā)現(xiàn)了在aspx頁(yè)還有一個(gè)顯示所有數(shù)據(jù)的的按鈕,對(duì)!這個(gè)按鈕是用來(lái)顯示顯示所有數(shù)據(jù)的,如果你覺(jué)得翻頁(yè)很累的話,可以直接點(diǎn)此按鈕進(jìn)行全部顯示。但是在實(shí)際的開(kāi)發(fā)中不建議這樣做,一方面如果數(shù)據(jù)量比較大時(shí),一下子顯示所有的數(shù)據(jù)對(duì)服務(wù)器的壓力很大,另一方面DataList本身不支持分頁(yè),它顯示數(shù)據(jù)的時(shí)候可以以橫向和縱向的方式顯示,我們分頁(yè)的時(shí)候用的是橫向顯示,如果顯示全部信息時(shí)所有信息都會(huì)橫向顯示用戶體驗(yàn)特別不好。顯示所有信息按鈕處理事件如下:
protected
void
btnshowall_Click(
object
sender, EventArgs e)
{
if
(btnshowall.Text ==
"顯示所有產(chǎn)品!"
)
{
Response.Redirect(
"ShowProducts.aspx?P=1"
);
}
else
{
Response.Redirect(
"ShowProducts.aspx"
);<br> }
}
好了,到這里關(guān)于使用PageDataSource和Request.CurrentExecutionFilePath實(shí)現(xiàn)便捷分頁(yè)已經(jīng)結(jié)束了,這里只是和大家分享一種便捷的方法而已,如果在真正的開(kāi)發(fā)中這種方法可能很少會(huì)用到,因?yàn)槿绻麛?shù)據(jù)量大的話每次訪問(wèn)都需要加載大量的數(shù)據(jù)對(duì)服務(wù)器的壓力特別大。如果是小的項(xiàng)目的話,可以使用這種方法來(lái)分頁(yè),使用存儲(chǔ)過(guò)程進(jìn)行數(shù)據(jù)讀取,這樣會(huì)對(duì)程序的性能有一定的提高。