国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ASP.NET中利用DataGrid實現(xiàn)高效分頁

2024-07-10 13:12:14
字體:
來源:轉載
供稿:網(wǎng)友
中國最大的web開發(fā)資源網(wǎng)站及技術社區(qū),
  asp.net中的datagrid有內置分頁功能, 但是它的默認的分頁方式效率是很低的,特別是在數(shù)據(jù)量很大的時候,用它內置的分頁功能幾乎是不可能的事,因為它會把所有的數(shù)據(jù)從數(shù)據(jù)庫讀出來再進行分頁, 這種只選取了一小部分而丟掉大部分的方法是不可去取的.
  
  在最進的一個項目中因為一個管理頁面要管理的數(shù)據(jù)量非常大,所以必須分頁顯示,并且不能用datagrid的內置分頁功能,于是自己實現(xiàn)分頁. 下面介紹一下我在項目中用到的分頁方法.
  
  當然顯示控件還是用datagrid的, 因為數(shù)據(jù)綁定很方便^_^.
  
  要保證不傳輸冗余的數(shù)據(jù),那么必須在數(shù)據(jù)庫中數(shù)據(jù)讀取時實現(xiàn)分頁, 數(shù)據(jù)庫的分頁操作可以放在存儲過程中. 看了csdn的一篇blog中講了一個百萬級數(shù)據(jù)分頁的存儲過程的實現(xiàn)(http://blog.csdn.net/wellknow/posts/55167.aspx,他的這個方法可以根據(jù)不同情況進行適當?shù)膬?yōu)化), 根據(jù)他的方法,這里實現(xiàn)一個簡單的sql語句來實現(xiàn)這里分頁需要的存儲過程。
  
  create procedure listproduct
  
  (
  
      @pageindex int, -- 分頁后需要頁的序號
  
      @pagesize int, -- 一頁的大小
  
      @conditionsql – 查詢條件的sql語句
  
  )
  
   as … 具體代碼就不寫了(可以參考上面的鏈接).
  
  具體的sql語句如下:
  
  select top 100 * from (select * from product where productid<200000) t where t.productid not in
  
  (select top 900 productid from (select productid from product where productid<200000) t1 order by t1.productid asc) order by productid asc
  
  這條語句的 從總的商品(30萬)中取出productid<200000(共20萬),再按每頁100的大小分頁,然后取出第10頁.
  
  public datatable listproduct(int pageindex, int pagesize)
  
  {
  
      //ado.net從數(shù)據(jù)庫中取出數(shù)據(jù)的代碼就略過^_^.
  
  }
  
  用上面的存儲過程讀出的數(shù)據(jù)在datagrid里面分頁, 必須把datagrid的allowpaging和allowcustompaging設置為true
  
  protected system.web.ui.webcontrols.datagrid productgrid;
  
  productgrid.allowpaging = true;
  
  productgrid.allowcustompaging = true;
  
  然后在設置要顯示的一頁的大小
  
  productgrid.pagesize = 100; // 在顯示的時候依據(jù)實際的數(shù)據(jù)顯示。
  
  設置一頁大小后,如果要讓datagrid實際分出頁數(shù)來,還必須設置
  
  productgrid.virtualitemcount = getproductcount() ; // getproductcount() 的功能是獲取滿足條件的產(chǎn)品數(shù)目, 這里的條件就是productid<200000. 設置這項屬性后,那么這個datagrid的頁數(shù)就是
  
  virtualitemcount/pagesize, 也就是pagecount的值. 不能對pagecount直接賦值,因為他是只讀的屬性.
  
  這些屬性設置好后再綁定數(shù)據(jù):
  
  productgrid.datasource = listproduct(1, productgrid.pagesize); // 在page_load里面 pageindex為1,記住判斷ispostback,在ispostback為false時執(zhí)行這些代碼
  
  productgrid.databind();
  
  這樣數(shù)據(jù)綁定后就可以看到具有分頁模樣的頁面了.但是還不能真正的分頁.要實現(xiàn)真正的分頁,還必須實現(xiàn)下面的功能.
  
  處理datagrid的pageindexchanged事件(處理用戶新選中某頁時的事件)
  
  private void productgrid_pageindexchanged(object source, system.web.ui.webcontrols.datagridpagechangedeventargs e)
  
  {
  
     // 如果在存儲過程分頁功能中用1表示第一頁的序號的話那么這里必須用e.newpageindex+1作為pageindex(如果選擇了datagrid上頁號為3的頁,那么e.newpageindex就為2), 否則的話直接用e.newpageindex就可以了
  
     productgrid.datasource = listproduct(e.newpageindex+1, productgrid.pagesize); // 從數(shù)據(jù)庫中讀取新的數(shù)據(jù)
  
     productgrid.databind();
  
     // 設置當前的page序號值, 如果不設置的話它是不會變得, 這樣會給用戶造成誤解,以為所有頁的數(shù)據(jù)相同。
  
     productgrid.currentpageindex =e.newpageindex;
  
  }
  
  如果你處理了datagrid的itemcommand的事件的話,必須在itemcommand事件處理代碼前面加上這些代碼:
  
  if (e.item.itemtype == listitemtype.pager)
  
  {
  
     return;
  
  }
  
  因為當pageindexchanged事件激發(fā),也就是用戶選則了另外一頁時會先激發(fā)itemcommand事件,如果不這樣處理的話,可能會遇到一些意想不到的情況(如果你確實需要的話也可以上面這段代碼,不過最好實際測試一下)。
  
  整個過程完成后,再次瀏覽頁面,覺得速度真是快多了
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 余庆县| 普安县| 沙洋县| 建平县| 浠水县| 苍梧县| 池州市| 安西县| 东源县| 黑河市| 荣昌县| 铜鼓县| 兰州市| 鹿泉市| 偏关县| 平泉县| 葫芦岛市| 平和县| 广灵县| 乐至县| 梧州市| 锡林郭勒盟| 海伦市| 藁城市| 巴中市| 汝阳县| 镇原县| 湖州市| 思茅市| 长子县| 察哈| 永泰县| 鹤山市| 开封县| 郑州市| 项城市| 黑山县| 开江县| 常熟市| 泸溪县| 察隅县|