摘要:在ASP.NET動態(tài)網(wǎng)站開發(fā)過程中,數(shù)據(jù)分頁是經(jīng)常使用的一種技術,但DataList和Rep eater控件沒有內置分頁功能,需要編寫分頁代碼,而這些分頁代碼大致相同。本文針對GridView、DataList和Repeater數(shù)據(jù)綁定控件,設計了分頁導航用戶控件,從而解決了網(wǎng)頁開發(fā)過程中大量分頁代碼重復的問題,提高網(wǎng)站開發(fā)效率。
關鍵詞:分頁技術;用戶控件;APS.NET
中圖分類號:TP391
文獻標識碼:A
DOI:10.3969/j.issn.1003-6970.2015.12.013
本文著錄格式:袁芳基于ASP.NET數(shù)據(jù)分頁導航的設計與應用[J]軟件,2015,36(12):60-62
1 引言
隨著計算機網(wǎng)絡技術與互聯(lián)網(wǎng)的發(fā)展與應用,人們越來越離不開網(wǎng)絡,上網(wǎng)瀏覽新聞、網(wǎng)購、搜索信息、發(fā)帖子等活動已成了我們生活的一部分,從而使得網(wǎng)站數(shù)據(jù)庫中的數(shù)據(jù)量呈現(xiàn)指數(shù)級增長。如果服務器端把用戶請求的數(shù)據(jù)全部以一個頁面發(fā)給客戶端的話,由于數(shù)據(jù)量大,會增加頁面顯示時間和頁面的總長度,這嚴重影響了用戶的體驗。針對這些問題,可以利用數(shù)據(jù)的分頁技術來解決。利用ASP.NET技術,本文詳細介紹了對網(wǎng)頁數(shù)據(jù)分頁的一些技術,并結合數(shù)據(jù)綁定控件的特點,設計分頁導航的用戶控件進行數(shù)據(jù)分頁,從而提高網(wǎng)站開發(fā)效率。
2 內置分頁功能的數(shù)據(jù)綁定控件
網(wǎng)頁中數(shù)據(jù)訪問的許多功能是由數(shù)據(jù)綁定控件來完成,ASP.NET有豐富的數(shù)據(jù)綁定控件,這是廣大網(wǎng)站開發(fā)人員樂于使用ASP.NET進行網(wǎng)站開發(fā)的一個重要原因。ASP.NET3.5中提供了GridView、DataList、Reapeater、ListView等數(shù)據(jù)綁定控件,其中具有內置分頁功能的有GridView控件、ListView控件和DetailsView控件,由于DetailsView控件每頁只顯示一條記錄信息,本文就不做介紹。
2.1 GridView控件分頁
GridView控件是以表格的形式顯示數(shù)據(jù)源的數(shù)據(jù)。它有內置分頁的功能,即該控件可以在不編寫任何代碼,僅僅設置相關屬性情況下,就可以實現(xiàn)數(shù)據(jù)綁定和分頁等功能。GridView控件要實現(xiàn)分頁功能只需設置AllowPaging屬性值為True,如果要指定每頁顯示的記錄數(shù),可以設置PageSize屬性,默認該屬性值為10條,分頁效果可以在屬性集合PagerSettings中進行設置。使用GridView內置分頁功能實現(xiàn)數(shù)據(jù)分頁,操作簡單,降低了網(wǎng)站開發(fā)難度,提高了開發(fā)效率,但需一次性將數(shù)據(jù)表中滿足條件的所有記錄讀入到內存,大大占用服務器資源,降低了服務器性能。所以這種分頁方式適合數(shù)據(jù)量比較少的情況使用,當數(shù)據(jù)量成千上萬時,就要編程分頁,可以使用緩存技術、存儲過程白定義分頁等技術。
2.2 ListView控件與DataPager控件結合分頁
從ASP.NET3.5開始,提供了全新的ListView控件和DataPager控件,結合使用這兩個控件就可以實現(xiàn)分頁顯示數(shù)據(jù)的功能。ListView控件用于顯示數(shù)據(jù),功能非常強大,它提供了編輯、刪除、插入、分頁與排序等數(shù)據(jù)操作功能和強大的顯示布局功能,同GridView控件類似,與GridView控件不同之處在于比GridView控件多了插入功能和使用用戶定義的模板而不是行字段來顯示數(shù)據(jù)。ListView控件的分頁功能是通過DataPager控件來實現(xiàn)的。DataPager控件的PagedCountID屬性值為ListView控件的ID值。DataPager控件擺放的位置可以是內嵌在ListView控件的
3 分頁導航用戶控件的設計與實現(xiàn)
在網(wǎng)站開發(fā)過程中,對GridView、DataList和Repeater數(shù)據(jù)綁定控件使用的比較頻繁。當數(shù)據(jù)量很多時,就需要對數(shù)據(jù)進行分頁,GridView控件白帶了分頁功能,但分頁樣式卻差強人意。而DataList和Repeater控件在布局上可以靈活多變,但他們沒有分頁功能,只能由開發(fā)者編寫大量代碼手動開發(fā),涉及分頁數(shù)據(jù)的頁面都要編寫分頁代碼,而這些分頁代碼大致是相同的,這會導致程序代碼重用率低,可維護性差和開發(fā)速度慢等問題。為了解決這些問題,本文設計和開發(fā)一個為這3個數(shù)據(jù)綁定控件都能使用的分頁導航用戶控件。
3.1 分頁導航用戶控件的界面設計
向網(wǎng)站項目中添加一個用戶控件,將它命名為UserDataPagerControl.ascx,用于數(shù)據(jù)分頁導航,在文件中添加7個控件,Label控件用于顯示當前是第幾頁、共多少頁,共多少條記錄,4個LinkButton控件用于翻頁,定位到首頁、上一頁、下一頁和末頁,DropDownList控件顯示共多少頁碼的列表,Button控件“跳轉”用于直接定位到DropDownList所選的頁,設計如圖l所示。
3.2 分頁導航用戶控件的后臺代碼
首先為分頁導航控件創(chuàng)建幾個屬性,通過這些屬性可以設置數(shù)據(jù)所需的參數(shù),DataBindControIID屬性是存放分頁頁面中數(shù)據(jù)綁定控件的ID信息,PageNum屬性為每頁顯示數(shù)據(jù)的條數(shù),DataSQL屬性為查詢數(shù)據(jù)表的sql語句,在全局的地方創(chuàng)建一個靜態(tài)PageDataS ource分頁數(shù)據(jù)源的對象pds,白定義一個BindDatalnfo方法,該方法是用來從數(shù)據(jù)庫中查詢_LH符合指定條件的記錄,并將數(shù)據(jù)信息綁定到數(shù)據(jù)綁定控件中,其參數(shù)為當前頁的索引值。在Page_Load事件中,第一次運行時,顯示第一頁,頁面索引值為0,調用該方法,即if(!IsPostBack){BindDatalnfo(0);},BindDatalnfo方法的代碼如下所示。
private void BindDatalnfo(int currentpage){
string controltype=dataBindControIID.GetType().ToString();//controltype為數(shù)據(jù)綁定控件的類型
controltype=controltype.Substring(controltype.LastlndexOf(“.”)+l,controltype.Length-l-cont roltype.LastlndexOf(“.”));
SqIConnection conn=new SqIConnection(Conf igurationManager.ConnectionStrings connD ataBase”].C onnectionString);
pds.AllowPaging=true;//允許分頁
pds.PageSize=pageNum;//每頁顯示數(shù)據(jù)條數(shù)
pds.CurrentPagelndex=currentpage;//currentpage為BindDatalnfo方法的參數(shù)值
conn.Open();//打開數(shù)據(jù)庫連接
SqIDataAdapter sda=new SqIDataAdapter(sql,conn):
DataSet ds=new DataSet():
sda.Fill(ds);//手巴執(zhí)行得到的數(shù)據(jù)放在數(shù)據(jù)集中
pds.DataSource=ds.Tables[O].DefaultView;//把數(shù)據(jù)集中的數(shù)據(jù)放人分頁數(shù)據(jù)源中
LabCount.Text=“第”+(pds.CurrentPagelndex+l)+“頁共”+pds.PageCount+“頁共”+pds.DataSourceCount+“條記錄”;
//當前頁為首頁時,設置“首頁”、“上一頁”按鈕無效
if(pds.IsFirstPage){
lbtnFirst.Enabled=false;
lbtnPre.Enabled=false;}else{
lbtnFirst.Enabled=true;
lbtnPre.Enabled=true;}
//當前頁為末頁時,設置“末頁”、“下一頁”按鈕無效
if(pds.IsLastPage){
lbtnNext.Enabled=false:
lbtnLast.Enabled=false;}else{
lbtnNext.Enabled=true:
lbtnLast.Enabled=true;{
//給下拉列表控件添加頁碼值列表
if(!IsPostBack){
for(int i=1;i<=pds.PageCount;i++){
ddIPages.Items.Add(i.ToString());}}
ddIPages.Selectedlndex=pds.CurrentPagelndex;//下拉列表控件顯示當前頁碼
//判斷頁面數(shù)據(jù)綁定控件的類型,進行相應的數(shù)據(jù)綁定
if(controltype==“GridView”){
((GridView)(dataBindControIID)).DataSource=pds;
((GridView)(dataBindControIID)).DataBind();}
else if(controltype==“DataList”){
((DataList)(dataBindControIID)).DataSource=pds;
((DataList)(dataBindControIID)).DataBind();}
else{
((Repeater)(dataBindControIID)).DataSource=pds;
((Repeater)(dataBindControIID)).DataBind();}
conn.Close();}//關閉數(shù)據(jù)庫連接
在頁面定位時,主要設計首頁、上一頁、下一頁、末頁和跳轉按鈕的單擊事件代碼的編寫,這些按鈕的代碼如下所述。在這5個按鈕的單擊事件中都定義一個整形int類型的局部變量pagelndex,“首頁”按鈕單擊事件代碼中對pagelndex變量賦“0”值;“上一頁”單擊事件代碼中對pagelndex值為“pds.CurrentPagelndex-1”,“下一頁”單擊事件代碼中對pagelndex值為“pds.CurrentPagelndex+1”;“末頁”單擊事件代碼中對pagelndex值為“pds.PageCount-1”,跳轉按鈕的單擊事件代碼中pagelndex值為“Convert.ToInt32(ddIPages.Selectedltem.Text)-l”,這5個按鈕單擊事件代碼最后都寫上調用白定義方法BindDatalnfo,代碼為“BindDatalnfo(pagelndex)”就可以完成翻頁和頁面的定位。
3.3 分頁導航用戶控件的應用
當分頁導航用戶白定義控件做好后,就可以像ASP.NET工具箱里控件一樣把UserDataPagerControl用戶控件拖到.aspx頁面中,下面以GridView和DataList數(shù)據(jù)綁定控件為類,可以輕松的完成數(shù)據(jù)分頁,在頁面開發(fā)過程中可以重復使用UserDataPagerControl用戶控件,從而大大提高開發(fā)的效率。
在GridView控件的頁面Page_Load事件代碼中,設置分頁導航控件的屬性值,添加如下代碼,運行效果如圖2所示
UserDataPagerControII.DataBindControIID=Gri dViewl:
UserDataPagerControII.DataSQL="select ID,Ti tle,Style,Type from tbNews";
UserDataPagerControll.PageNum=6;
在DataList控件的頁面Page_Load事件代碼中,設置分頁導航控件的屬性值,添加如下代碼.運行效果如圖3所示。
UserDataPagerControll.DataBindControllD=Dat aListl:
UserDataPagerControll.DataSQL="select Book Name.BookAuthor.BookPrice.Booklinage from tbBooks":
UserDataPagerControll.PageNum=2;
4 總結
在Web應用程序開發(fā)中,數(shù)據(jù)分頁是經(jīng)常使用的一種技術,也是提高數(shù)據(jù)訪問性能和用戶體驗的一主要手段。在動態(tài)網(wǎng)頁開發(fā)過程中,對GridView、Da taList和Repeater數(shù)據(jù)綁定控件使用頻率比較高,本文自定義了分頁導航用戶控件,該控件可以像工具箱里其它內置控件一樣任意使用,適合對GridView、Da taList和Repeater數(shù)據(jù)綁定控件的數(shù)據(jù)進行分頁,從而解決了動態(tài)網(wǎng)站開發(fā)過程中大量分頁代碼重復問題,提高了代碼的重用率、網(wǎng)站的開發(fā)效率和系統(tǒng)的可維護性。