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