DataList分頁

 轉載::深入研究DataList分頁方法

2008-03-20 12:59 by 蕭別離, 7684 visits, 網摘, 收藏, 編輯
此文章轉至http://www.tobrush.com/archives/617301(隋心所欲)
 
從Asp.net 1.1開始,我們就開始使用DataGrid、DataList、Repeater控件,到了Asp.net 2.0又增加了
GridView控件。GridView控件在DataGrid上做了優化和改進,功能很強大,但是自定義性不夠強。
Repeater自定義性非常高。而DataList則兼而有之,其他方面本文不談。這裏就說下怎麼給DataList分
頁。
給DataList分頁有兩個辦法:1   、自己寫2、用第三方控件(如AspNetPager)
使用第三方控件的方法我就不說了,這裏主要說說如何自己實現分頁方法。
我的DataList分頁方法的核心原理是利用PagedDataSource對象,PagedDataSource類封裝了DataGrid 
  控件的屬性,這些屬性使DataGrid 可以執行分頁,下面是PagedDataSource的公共屬性:
AllowCustomPaging 獲取或設置指示是否啓用自定義分頁的值。
AllowPaging 獲取或設置指示是否啓用分頁的值。
Count 獲取要從數據源使用的項數。
CurrentPageIndex 獲取或設置當前頁的索引。
DataSource 獲取或設置數據源。
DataSourceCount 獲取數據源中的項數。
FirstIndexInPage 獲取頁中的第一個索引。
IsCustomPagingEnabled 獲取一個值,該值指示是否啓用自定義分頁。
IsFirstPage 獲取一個值,該值指示當前頁是否是首頁。
IsLastPage 獲取一個值,該值指示當前頁是否是最後一頁。
IsPagingEnabled 獲取一個值,該值指示是否啓用分頁。
IsReadOnly 獲取一個值,該值指示數據源是否是隻讀的。
IsSynchronized 獲取一個值,該值指示是否同步對數據源的訪問(線程安全)。
PageCount 獲取顯示數據源中的所有項所需要的總頁數。
PageSize 獲取或設置要在單頁上顯示的項數。
VirtualCount 獲取或設置在使用自定義分頁時數據源中的實際項數。
  那麼如何使用PagedDataSource對象進行DataList分頁呢?(網上有很多的講DataList分頁的文章,有
一些是糊弄人的,有的還無法起作用,我被騙過一次,本文是我經過個人實踐經驗得到,可以順利執行。
希望對大家有所幫助。)現在開始拉!
第一步,取出數據到        datatable        中,然後獲得        dataview   ,付給        PagedDataSource        對象   
DataView objView = objTable.DefaultView;
PagedDataSource objPds = new PagedDataSource();
objPds.DataSource = objView;
第二步,   PagedDataSource        對象        objPds        的設置   
objPds.AllowPaging = true;
objPds.PageSize = 4;
objPds.CurrentPageIndex = int.Parse(ViewState[“pageindex”].ToString());
上面的這兩段代碼都是寫在BindData()函數中的,供每次點擊分頁按鈕時調用。BindData()函數如
下:
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>
到此爲止,我們已經將數據交給了PagedDataSource,剩下的分頁將利用PagedDataSource 進行處
理。可能大家注意到了,這個數據交付是完整的數據交付,如果數據量很大會造成一定的效率低下,
不過這裏暫時不考慮這個問題。有興趣的朋友可以一起探討一下。
  上面的第三行代碼中的ViewState[“pageindex”] 是用來控制PagedDataSource的當前頁的,我們在
Page_Load   事件中和第三步將要將的函數中來具體講解如何利用ViewState[“pageindex”]控制當前
頁。
BindData()函數中後面的部分是控制向前向後按鈕的顯隱的,不再多說。
第三步,分頁控制
  第二步中說過利用ViewState[“pageindex”] 來控制當前頁,爲了在頁面加載的時候就顯示第一頁,
我們當然要在Page_load   事件中將ViewState[“pageindex”]置爲0。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ViewState[“pageindex”] = “0″;
BindData(); }
}
我們需要加兩個按鈕(Previous、Next)來點擊進行分頁控制。
<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=”se
rver” >PREVIOUS PAGE></asp:linkbutton>
<asp:linkbutton ID=”lkNext” OnCommand=”IndexChanging” CommandArgument=”next” runat=
”server” >NEXT PAGE</asp:linkbutton>
兩個按鈕的 OnCommand都是IndexChanging()函數,我們通過CommandArgument(pre和
next)來區分到底是向前翻還是向後翻。下面是IndexChanging()函數
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();
}
至此,我們的分頁函數已經寫完了。這裏還有一些東西沒有說,比如顯示一共多少條記錄,當前第
幾頁,一共多少頁以及每一頁的頁碼。相信看懂了上面所說的後這些東西還是容易寫出來的。
總結一下,我們在前臺寫好DataList等待數據,而數據是由PagedDataSource提供的,分頁通過我
們新加的兩個ImageButton來控制ViewState進而達到控制PagedDataSource的CurrentPageIndex
來實現的。所以,其實DataList也沒幹啥事,就是顯示了每一頁的數據而已。有一點需要說明,
PagedDataSource的CurrentPageIndex是從0開始的,這也是爲什麼在Page_load事件中要講
ViewState置爲0而不是1的緣故。
OK “ ” 了~聽着周杰倫的 陽光宅男 寫完了這篇blog   ,希望對大家有所幫助。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章