從Asp.net 1.1開(kāi)始,我們就開(kāi)始使用DataGrid、DataList、Repeater控件,到了Asp.net 2.0又增加了GridView控件。GridView控件在DataGrid上做了優(yōu)化和改進(jìn),功能很強(qiáng)大,但是自定義性不夠強(qiáng)。Repeater自定義性非常高。而DataList則兼而有之,其他方面本文不談。這里就說(shuō)下怎么給DataList分頁(yè)。
給DataList分頁(yè)有兩個(gè)辦法:1、自己寫(xiě) 2、用第三方控件(如AspNetPager)
使用第三方控件的方法我就不說(shuō)了,這里主要說(shuō)說(shuō)如何自己實(shí)現(xiàn)分頁(yè)方法。
我的DataList分頁(yè)方法的核心原理是利用PagedDataSource對(duì)象,PagedDataSource類(lèi)封裝了DataGrid 控件的屬性,這些屬性使 DataGrid 可以執(zhí)行分頁(yè),下面是PagedDataSource的公共屬性:
AllowCustomPaging 獲取或設(shè)置指示是否啟用自定義分頁(yè)的值。
AllowPaging 獲取或設(shè)置指示是否啟用分頁(yè)的值。
Count 獲取要從數(shù)據(jù)源使用的項(xiàng)數(shù)。
CurrentPageIndex 獲取或設(shè)置當(dāng)前頁(yè)的索引。
DataSource 獲取或設(shè)置數(shù)據(jù)源。
DataSourceCount 獲取數(shù)據(jù)源中的項(xiàng)數(shù)。
FirstIndexInPage 獲取頁(yè)中的第一個(gè)索引。
IsCustomPagingEnabled 獲取一個(gè)值,該值指示是否啟用自定義分頁(yè)。
IsFirstPage 獲取一個(gè)值,該值指示當(dāng)前頁(yè)是否是首頁(yè)。
IsLastPage 獲取一個(gè)值,該值指示當(dāng)前頁(yè)是否是最后一頁(yè)。
IsPagingEnabled 獲取一個(gè)值,該值指示是否啟用分頁(yè)。
IsReadOnly 獲取一個(gè)值,該值指示數(shù)據(jù)源是否是只讀的。
IsSynchronized 獲取一個(gè)值,該值指示是否同步對(duì)數(shù)據(jù)源的訪問(wèn)(線程安全)。
PageCount 獲取顯示數(shù)據(jù)源中的所有項(xiàng)所需要的總頁(yè)數(shù)。
PageSize 獲取或設(shè)置要在單頁(yè)上顯示的項(xiàng)數(shù)。
VirtualCount 獲取或設(shè)置在使用自定義分頁(yè)時(shí)數(shù)據(jù)源中的實(shí)際項(xiàng)數(shù)。
那么如何使用 PagedDataSource對(duì)象進(jìn)行DataList分頁(yè)呢?(網(wǎng)上有很多的講DataList分頁(yè)的文章,有一些是糊弄人的,有的還無(wú)法起作用,我被騙過(guò)一次,本文是我經(jīng)過(guò)個(gè)人實(shí)踐經(jīng)驗(yàn)得到,可以順利執(zhí)行。希望對(duì)大家有所幫助。)
現(xiàn)在開(kāi)始拉!
第一步,取出數(shù)據(jù)到datatable中,然后獲得dataview,付給PagedDataSource對(duì)象
DataView objView = objTable.DefaultView;
PagedDataSource objPds = new PagedDataSource();
objPds.DataSource = objView;
第二步,PagedDataSource對(duì)象objPds的設(shè)置
objPds.AllowPaging = true;
objPds.PageSize = 4;
objPds.CurrentPageIndex = int.Parse(ViewState[“pageindex”].ToString());
上面的這兩段代碼都是寫(xiě)在BindData()函數(shù)中的,供每次點(diǎn)擊分頁(yè)按鈕時(shí)調(diào)用。BindData()函數(shù)如下:
private void BindData()
{
string sql = “SELECT * From team”;
DataTable objTable = data.GetDataTable(sql);
if (objTable != null && objTable.Rows.Count > 0)
{
DataView objView = objTable.DefaultView;
PagedDataSource objPds = new PagedDataSource();
objPds.DataSource = objView;
objPds.AllowPaging = true;
objPds.PageSize = 4;
objPds.CurrentPageIndex = int.Parse(ViewState[”pageindex”].ToString());
if (!objPds.IsFirstPage)
{
lkPre.Visible = true;
}
else
{
lkPre.Visible = false;
}
if (!objPds.IsLastPage)
{
lkNext.Visible = true;
}
else
{
lkNext.Visible = false;
}
dlData.DataSource = objPds;
dlData.DataBind();
}
}
blockquote>
到此為止,我們已經(jīng)將數(shù)據(jù)交給了PagedDataSource,剩下的分頁(yè)將利用PagedDataSource 進(jìn)行處理??赡艽蠹易⒁獾搅耍@個(gè)數(shù)據(jù)交付是完整的數(shù)據(jù)交付,如果數(shù)據(jù)量很大會(huì)造成一定的效率低下,不過(guò)這里暫時(shí)不考慮這個(gè)問(wèn)題。有興趣的朋友可以一起探討一下。
上面的第三行代碼中的 ViewState[“pageindex”] 是用來(lái)控制PagedDataSource的當(dāng)前頁(yè)的,我們?cè)赑age_Load事件中和第三步將要將的函數(shù)中來(lái)具體講解如何利用 ViewState[“pageindex”]控制當(dāng)前頁(yè)。
BindData()函數(shù)中后面的部分是控制向前向后按鈕的顯隱的,不再多說(shuō)。
第三步,分頁(yè)控制
第二步中說(shuō)過(guò)利用 ViewState[“pageindex”] 來(lái)控制當(dāng)前頁(yè),為了在頁(yè)面加載的時(shí)候就顯示第一頁(yè),我們當(dāng)然要在Page_load事件中將 ViewState[“pageindex”]置為0。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ViewState[“pageindex”] = “0″;
BindData(); }
}
我們需要加兩個(gè)按鈕(Previous、Next)來(lái)點(diǎn)擊進(jìn)行分頁(yè)控制。
<asp:DataList ID=”dlData” runat=”server” RepeatColumns=”4″ >
<ItemTemplate>
<asp:Label ID=”lblName” runat=”server” /><br />
<asp:Label ID=”lblTime” runat=”server” />
</ItemTemplate>
</asp:DataList>
<asp:linkbutton ID=”lkPre” OnCommand=”IndexChanging” CommandArgument=”pre” runat=”server” >PREVIOUS PAGE></asp:linkbutton>
<asp:linkbutton ID=”lkNext” OnCommand=”IndexChanging” CommandArgument=”next” runat=”server” >NEXT PAGE</asp:linkbutton>
兩個(gè)按鈕的 OnCommand都是IndexChanging()函數(shù),我們通過(guò)CommandArgument(pre和next)來(lái)區(qū)分到底是向前翻還是向后翻。下面是IndexChanging()函數(shù)
protected void IndexChanging(object sender, EventArgs e)
{
string strCommand = ((LinkButton)sender).CommandArgument.ToString();
int pageindex = int.Parse(ViewState[“pageindex”].ToString());
if (strCommand == “pre”)
{
pageindex = pageindex - 1;
}
else
{
pageindex = pageindex + 1;
}
ViewState[“pageindex”] = pageindex;
BindData();
}
至此,我們的分頁(yè)函數(shù)已經(jīng)寫(xiě)完了。這里還有一些東西沒(méi)有說(shuō),比如顯示一共多少條記錄,當(dāng)前第幾頁(yè),一共多少頁(yè)以及每一頁(yè)的頁(yè)碼。相信看懂了上面所說(shuō)的后這些東西還是容易寫(xiě)出來(lái)的。
總結(jié)一下,我們?cè)谇芭_(tái)寫(xiě)好DataList等待數(shù)據(jù),而數(shù)據(jù)是由PagedDataSource提供的,分頁(yè)通過(guò)我們新加的兩個(gè)ImageButton來(lái)控制ViewState進(jìn)而達(dá)到控制PagedDataSource的CurrentPageIndex來(lái)實(shí)現(xiàn)的。所以,其實(shí)DataList也沒(méi)干啥事,就是顯示了每一頁(yè)的數(shù)據(jù)而已。有一點(diǎn)需要說(shuō)明,PagedDataSource的CurrentPageIndex是從0開(kāi)始的,這也是為什么在Page_load事件中要講ViewState置為0而不是1的緣故。