下面就來重點說說這幾種分頁方式:
一般情況下我們都是通過sql語句來分頁,這在無論哪種開發語音都是通用的,
使用sql語句或者存儲過程分頁的方式最主要的是要在讀取數據的時候把sql語句或者存儲過程寫好,它的原理是只讀取當前要顯示的幾行記錄,所以要根據頁數和每頁顯示的數目來寫語句,如下:
Select top pageSize * from News where id not in(select top (Page-1)*pageSize id from News)
很顯然只要將pageSize和Page作為參數就可以了,然後再前台調用的時候只要指定當前頁數和每頁顯示的數目,就可以實現分頁了,為了顯示總數目,還可以讀取所有數目,需要注意的時候,如果是自定義分頁視圖,由於.net在回傳的時候不保存當前頁,所以要使用ViewState來保存頁數,每次只讀取所需要的幾條記錄,所以適合做大型網站數量比較大的時候使用
另外一種分頁方式就是使用.net提供的PageDataSource類來分頁,
PageDataSource是微軟提供一個用於分頁使用的類,集成了綁定控件的一些方法,在使用的時候,我們只需要從數據庫讀取我們所要的數據,綁定到PageDataSource即可,然後允許PageDataSource可以分頁,指定當前頁和每頁要顯示的數目,這樣就可以很好的獲得的總的數目,結合控件,ViewState就可以完成自定義分頁視圖,方法如下:
PagedDataSource pageDataSource = new PagedDataSource();
pageDataSource.DataSource = NewsManager.GetNews();//所有記錄
pageDataSource.AllowPaging = true;
pageDataSource.PageSize = 16;
pageDataSource.CurrentPageIndex = Pager– 1;
this.Repeater1.DataSource = pageDataSource;
this.Repeater1.DataBind();
由於PageDataSource是將所有的數據都讀出來,然後再分頁的,所有適合一些小型網站,比如企業站,數量不是很大的時候使用,大概2w以內的數據使用
上面是常用的兩種分頁方式,下面在來看看分頁視圖控件AspNetPager的用法:
AspNetPager屬於第三方控件,就是說既不是微軟開發的,也不是你開發的,而是由其他技術員自己開發的,共享給我們用的控件,所以在使用的時候,我們首先要從網上下載下來,然後和其他控件一樣,首先將其放到工具箱內,這裡你可以直接拖進來,或者也可以右擊工具菜單項---選擇項,找到目錄添加進來即可
下面簡單說一下它的一些屬性和方法
AlwaysShow:表示當前在只有一頁的時候,控件是顯示還是不顯示
PageSize:每頁要顯示的數目
RecordCount:總數目
NumericButtonCount:每頁要顯示的頁碼數目
注:上面三個屬性就是用來顯示分頁控件的視圖,但是他們只是為了顯示分頁控件的視圖。
FirstPageText="第一頁"
LastPageText="最後一頁"
NextPageText="下一頁"
PrevPageText="前一頁"
PagingButtonSpacing="12":每個頁碼之間的寬度
NumericButtonTextFormatString="[{0}]" :頁碼顯示的樣式
EnableUrlRewriting="true":是否啟用url重寫,默認的情況下是域名?page=頁碼
如:http://www.hnzbtb.com/NewList.aspx?page=3,不過你可以對其修改 重新
UrlRewritePattern:重寫的url,如:AspNetPager1.UrlRewritePattern = "NewList.aspx?dd={0}"
注:這裡要提到的是如果要改變要顯示頁碼的參數,那就必須修改顯示,然後再修改url中的參數
UrlPaging="True" :是否只用url傳遞參數來顯示分頁,如果是FALSE,則url不變,狀態欄則顯示
SubmitButtonText="轉到" ShowInputBox="Always":用來解決轉到按鈕的顯示
兩個常用的方法
1、PageChanging:分頁之前的操作,所以要想獲得當前控件的頁碼就必須在方法內賦值才可以,否則AspNetPager1.CurrentPageIndex永遠獲得的當前頁的值都是1,因為就相當於你沒點擊任何頁碼,從開始都是1,所以你無論點擊那個頁碼說,之前的都是1
protected void AspNetPager1_PageChanging(object src, Wuqi.Webdiyer.PageChangingEventArgs e)
{
Pager = e.NewPageIndex - 1;
DataBindNews();
}
public void DataBindNews()
{
PagedDataSource pageDataSource = new PagedDataSource();
pageDataSource.DataSource = NewsManager.GetNews();
pageDataSource.AllowPaging = true;
AspNetPager1.RecordCount = NewsManager.GetNewsCount();
pageDataSource.PageSize = 16;
pageDataSource.CurrentPageIndex = Pager;
this.Repeater1.DataSource = pageDataSource;
this.Repeater1.DataBind();
}
之所以減1是因為要結合的分頁方法和PageDataSource都是從0開始的
GrilView中自定義的分頁,我們也會用到它的
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
this.GridView1.PageIndex = e.NewPageIndex;
dataBindProduct(0, null);
}
2、PageChanged:點擊頁碼之後的操作,所以可以直接通過AspNetPager1.CurrentPageIndex – 1獲得當前頁的頁數,因為之前確實點擊了頁碼數,很顯然會獲得當前的頁碼數
protected void AspNetPager1_PageChanged(object src,EventArgs e)
{
DataBindNews();
}
public void DataBindNews()
{
PagedDataSource pageDataSource = new PagedDataSource();
pageDataSource.DataSource = NewsManager.GetNews();
pageDataSource.AllowPaging = true;
AspNetPager1.RecordCount = NewsManager.GetNewsCount();
pageDataSource.PageSize = 16;
pageDataSource.CurrentPageIndex = AspNetPager1.CurrentPageIndex – 1;
this.Repeater1.DataSource = pageDataSource;
this.Repeater1.DataBind();
}
如果使用了AspNetPager來分頁,那麼只要指定總數給aspNetPager,當前頁用aspNetPager來指定,並保證每頁顯示的數目aspNetPager和PageDataSource指定的一致就可以實現分頁了,簡單吧,這個頁數的控制就不使用viewstate來保存了,頁數和頁顯示記錄直接通過Asp.Net來控制就行了
需要注意的是有些需要一致的東西,如果沒有一致,就有可能導致不協調,比如該分4頁的,但是aspNetPager只顯示了2頁等,這些都需要注意的!
下面簡單分享一下分頁控件的一個樣式:
Css樣式:
.pages
{
color: #999;
}
.pages a, .pages .cpb
{
text-decoration: none;
float: left;
padding: 0 5px;
border: 1px solid #075198;
background: #ffff;
margin: 0 2px;
font-size: 11px;
color: #000;
}
.pages a:hover
{
background-color: #075198;
color: #fff;
border: 1px solid #075198;
text-decoration: none;
}
.pages .cpb
{
font-weight: bold;
color: #fff;
background: #075198;
border: 1px solid #075198;
}