台灣最大程式設計社群網站
線上人數
1063
 
會員總數:244982
討論主題:188952
歡迎您免費加入會員
討論區列表 >> Blog精華文章 >> asp.net(C#)一步步完成分頁自定控制項_分頁不再痛苦又難搞(一)
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
asp.net(C#)一步步完成分頁自定控制項_分頁不再痛苦又難搞(一)
價值 : 0 QP  點閱數:891 回應數:0

樓主

呆呆喵
中級專家
3109 114
3353 953
發送站內信

捐贈 VP 給 呆呆喵

網頁開發時,最耗頻寬的就是資料流來去,我相信使用.net開發n年的web form程式老鳥,一定都遇過將資料表分頁以求網頁速度加快的效能加速問題,你說分頁有什麼難的,gridview都做好啦,在.net IDE的右邊工具屬性列,什麼分頁筆數、排序欄位、連分頁的頁面設定都幫你搞定了,一點都不費力氣...ㄟ...如果有人這麼想的話,那麼你可以在你的網頁呈現頁面,點一下右鍵去檢視網頁原始碼,你就會發現Gridview把你資料表的資料全部都載入放到viewstate裡去,也許你的user只要看3000筆資料中,每30筆為一頁裡的第n頁資料,Gridview為了排序放便,將資料全部偷偷放在viewstate裡,即使只是要看30筆資料,也通通把3000筆資料全部載入到web form (aspx)裡,這樣一來你的網頁檔案大小就會膨脹好幾倍,這是很恐怖的事情,如果你公司網頁不在乎流量頻寬這種事情的話,麻煩有職缺請mail通知我一下。

撇開網頁檔案大小不談,光是網站的SEO都能決定viewstate的生死,什麼?你還沒聽過SEO?(好吧~我知道有些公司是不在乎這個的)SEO其實很早的時候就被提出來,只是在特別講求網路排名的網站公司,會更加關注這個話題相關的技術動向,SEO其實是代表搜尋引擎在搜尋網站網頁的相關方法,各家搜尋引擎的搜尋方法不同,有些serch engine只會取網頁的前100K資料,如果你的網頁viewstate超過100k並且放在網頁的前方,那網頁內容根本就無法被正確的搜尋出來,相對的,如果你的viewstate大小甚至比網頁呈現的內容本文多出很多,還會降低你的pagerank,不過這是另外的話題了。

回到本文主題→分頁控制項,分頁有很多種方式可以做,我個人比較習慣在資料庫中做分頁,一來我認為資料庫本身就是專門for排序和查詢資料用,不只是存放資料這麼簡單的功能而已,二來用程式做要花費相當長的時間來開發,我就有同事利用jquery寫出了分頁的功能,根本就不需要在aspx.cs檔案裡面去寫什麼分頁的程式碼,最後寫完只要套用他的js就好,真的是造福後人耶....資料表的資料固定在10幾筆到300筆的資料量時,可以這麼做,萬一資料量超過1000筆的話,這麼做跟gridview耗損的頻寬量大小是差不多的意思,所以在這裡我只介紹sql的分頁store procedure和提供pagehelp控制項,以及aspx.cs裡程式如何配合sql的分頁store procedure。

 1.在SQL資料集裡新增分頁的store procedure;Return_Page

2.下載分頁控制項pageHelp,解壓縮後有2個檔案pageHelpSc.ascx和pageHelpSc.ascx.cs檔,開發aspx 時將此元件加入頁面。

3.點一下aspx頁面裡插入的pageHelp元件,在右邊屬性列設定分頁的資料筆數量pageSize。

4.aspx.cs檔裡,開發取得資料的部份時,提供正確的欄位,資料表名稱,where條件,order條件,要指定的第幾頁頁數,最後一個分頁筆數量就提供pageHelp.pageSize。

然後將取得的table,bind給gridview~~~你以為這樣就都結束了嗎?還有一件很重要的事情,就是要弄清楚網頁控制項和網頁之間執行的先後順序,這部份我搞了好久才弄懂,因為usercontrol是在網頁載入之後,才會再去載入usercontrol,如果你把上面那段c#程式放在pageload裡,那你的分頁控制項永遠顯示的頁面和它應該呈現的頁數都會不對。

5.上面那段c#程式寫成一個public void並命名為bind(),在aspx的html檢視頁裡,加上<uc1:pageHelpSc ID="PageHelpSc1" runat="server" pageSize="20" OnPreRender="pageHelpSc_PreRender" />後面那段紅字。

6.在aspx.cs裡加入下面這一段

不需要在ASPX的Page_Load裡再加上bind();,因為物件執行順序是先load page,再load usercontrol,假設你在Page_Load裡加上bind();,就等於網頁載入了2次資料,一次是在Page_load時,第2次則是在PageHelp_PreRender時。

@@還有,請注意pageHelp物件的viewstate不要設為false。否則pagesize會一直為預設值,這樣就很搞笑了。另外排序的問題,留到 [asp.net(C#)一步步完成分頁自定控制項_分頁不再痛苦又難搞(二)] 再來講...我累了~~


本篇文章發表於2012-04-27 10:01
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
目前尚無任何回覆
   

回覆
如要回應,請先登入.