利用SqlDataAdapter進(jìn)行記錄分頁(yè)
說(shuō)到分頁(yè),很多地方都會(huì)用到,不管是windows程序還是web程序,為什么要進(jìn)行分頁(yè)?很簡(jiǎn)單,如果BlueIdea BBS帖子列表不分頁(yè)的話(huà),幾十萬(wàn)條記錄,可想而知.......
分頁(yè)有幾種方法,可以用存儲(chǔ)過(guò)程進(jìn)行分頁(yè),將要顯示的記錄寫(xiě)入一個(gè)臨時(shí)表中,再?gòu)呐R時(shí)表中取出這些記錄,取出的記錄呢,也就是當(dāng)前頁(yè)的記錄了。 我這里談到的,是利用SqlDataAdapter Fill方法的重載,進(jìn)行分頁(yè)
public int Fill ( DataSet dataSet, int startRecord, int maxRecords, string srcTable )
參數(shù):
dataSet 要用記錄和架構(gòu)(如果必要)填充的 DataSet。
startRecord 從其開(kāi)始的從零開(kāi)始的記錄號(hào)。
maxRecords 要檢索的最大記錄數(shù)。
srcTable 用于表映射的源表的名稱(chēng)。
返回值 已在 DataSet 中成功添加或刷新的行數(shù)。這不包括受不返回行的語(yǔ)句影響的行。
示例方法:
DataTable tbl = SqlDataAdapter.Fill(objDst,1,10,"temp")
言歸正傳,在這個(gè)設(shè)計(jì)過(guò)程中,我們需要哪些參數(shù)呢?
1、_pagesize----int型,每頁(yè)要顯示的記錄數(shù)
2、_pagecount----總記錄數(shù),這是需要算出來(lái)的
_pagesize可以在web.config中設(shè)定,至于_pagecount嘛,得首先知道總的記錄數(shù),所以,我們得先弄出記錄數(shù)出來(lái),大家可以用一條sql語(yǔ)句查詢(xún)而得到,這里就不多說(shuō)了。假定已得知記錄數(shù),現(xiàn)在計(jì)算總頁(yè)數(shù)
_pagecount = (_recordCount % _pagesize==0) ? (_recordCount / _pagesize) : (_recordCount / _pagesize + 1);
這里用總記錄數(shù)去除以每頁(yè)顯示的記錄數(shù),如果能整除,說(shuō)明直接用記錄數(shù)除以頁(yè)記錄數(shù)就能得到總頁(yè)數(shù),否則,就用記錄數(shù)除頁(yè)記錄數(shù)再加上1就可得到總頁(yè)數(shù)了 是不是具備這些就夠了呢? 當(dāng)然不夠 想想,Fill方法時(shí)的第二個(gè)參數(shù)startRecord怎么賦值呢?如果是第1頁(yè)的話(huà)很簡(jiǎn)單,直接傳1,因?yàn)槲覀儚牡?條開(kāi)始取嘛,如果是第二頁(yè)呢?怎么辦? 假定,我們每頁(yè)顯示10條,當(dāng)前是第2頁(yè),那么應(yīng)該從多少條開(kāi)始??大家應(yīng)該想到了,應(yīng)該從11條開(kāi)始,也就是取11-20條,那這里的11怎么得到? 算法: (_page-1) * _pagesize + 1 (2-1) * 10 + 1 = 11 其中_page是當(dāng)前頁(yè),但這個(gè)數(shù)必須大于1 OK,有了這些基礎(chǔ),再來(lái)分頁(yè)就簡(jiǎn)單了
..... int _page; int _pagesize = 10; int _pagecount; int _recordcount; System.Text.StringBuilder sbPager = new System.Text.StringBuilder(); //用來(lái)顯示分頁(yè) //在.aspx頁(yè)中調(diào)用,用以顯示分頁(yè)代碼 public string getPager() { return sbPager.ToString(); } //計(jì)算出記錄數(shù) _recordcount = 134; //判斷當(dāng)前頁(yè)數(shù) private void Page_Load(object sender, System.EventArgs e) { if(Request.QueryString["page"]==null) { _page = 1; } else { _page = Int16.Parse(Request.QueryString["page"]); } ............... } //開(kāi)始填充數(shù)據(jù) private void FillList() { _recordcount= BLL.MessageBLL.getListCount(""); //取得總記錄數(shù) _pagecount = (_recordcount % _pagesize==0)?(_recordcount/_pagesize):(_recordcount/_pagesize+1); //得到總頁(yè)數(shù) int _minPage=1; if(_page!=1) { _minPage = (_page-1)*_pagesize + 1; } this.repMsgList.DataSource = BLL.MessageBLL.GetList("",_minPage,_pagesize); this.repMsgList.DataBind(); #region 打印頁(yè)數(shù) for (int i = 1; i <= _pagecount; i++) { if (i == _page) //如果是當(dāng)前頁(yè),不顯示鏈接 sbPager.Append("<span >" + i.ToString() + "</span> "); else { sbPager.Append("<a href=?page="+i+">" + i + "</a> "); } } sbPager.Append(_recordcount + " Records"); #endregion }
在前臺(tái)中 分頁(yè):<%=getPager()%>調(diào)用就OK了 這樣,初級(jí)的分頁(yè)就完成了 但這樣寫(xiě)代碼很煩瑣,看以后能不能寫(xiě)成一個(gè)自定義控件.
經(jīng)典論壇討論帖: http://m.95time.cn/bbs/NewsDetail.asp?id=2547620
出處:藍(lán)色理想
責(zé)任編輯:moby
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|