asp.net中的datagrid有內建分頁功能, 但是它的預設的分頁方式效率是很低的,特別是在資料量很大的時候,用它內建的分頁功能幾乎是不可能的事,因為它會把所有的資料從資料庫讀出來再進行分頁, 這種只選取了一小部分而丟掉大部分的方法是不可去取的.
在最進的乙個專案中因為乙個管理頁面要管理的資料量非常大,所以必須分頁顯示,並且不能用datagrid的內建分頁功能,於是自己實現分頁. 下面介紹一下我在專案中用到的分頁方法.
當然顯示控制項還是用datagrid的, 因為資料繫結很方便^_^.
要保證不傳輸冗餘的資料,那麼必須在資料庫中資料讀取時實現分頁, 資料庫的分頁操作可以放在儲存過程中. 看了csdn的一篇blog中講了乙個百萬級資料分頁的儲存過程的實現(http://blog.csdn.net/wellknow/posts/55167.aspx,他的這個方法可以根據不同情況進行適當的優化), 根據他的方法,這裡實現乙個簡單的sql語句來實現這裡分頁需要的儲存過程。
create procedure listproduct
(
@pageindex int, -- 分頁後需要頁的序號
@pagesize int, -- 一頁的大小
@conditionsql – 查詢條件的sql語句
)
具體的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)
用上面的儲存過程讀出的資料在datagrid裡面分頁, 必須把datagrid的allowpaging和allowcustompaging設定為true
protected system.web.ui.webcontrols.datagrid productgrid;
productgrid.allowpaging = true;
productgrid.allowcustompaging = true;
然後在設定要顯示的一頁的大小
productgrid.pagesize = 100; // 在顯示的時候依據實際的資料顯示。
設定一頁大小後,如果要讓datagrid實際分出頁數來,還必須設定
productgrid.virtualitemcount = getproductcount() ; // getproductcount() 的功能是獲取滿足條件的產品數目, 這裡的條件就是productid<200000. 設定這項屬性後,那麼這個datagrid的頁數就是
virtualitemcount/pagesize, 也就是pagecount的值. 不能對pagecount直接賦值,因為他是唯讀的屬性.
這些屬性設定好後再繫結資料:
productgrid.datasource = listproduct(1, productgrid.pagesize); // 在page_load裡面 pageindex為1,記住判斷ispostback,在ispostback為false時執行這些**
productgrid.databind();
這樣資料繫結後就可以看到具有分頁模樣的頁面了.但是還不能真正的分頁.要實現真正的分頁,還必須實現下面的功能.
處理datagrid的pageindexchanged事件(處理使用者新選中某頁時的事件)
private void productgrid_pageindexchanged(object source, system.web.ui.webcontrols.datagridpagechangedeventargs e)
如果你處理了datagrid的itemcommand的事件的話,必須在itemcommand事件處理**前面加上這些**:
if (e.item.itemtype == listitemtype.pager)
因為當pageindexchanged事件激發,也就是使用者選則了另外一頁時會先激發itemcommand事件,如果不這樣處理的話,可能會遇到一些意想不到的情況(如果你確實需要的話也可以上面這段**,不過最好實際測試一下)。
整個過程完成後,再次瀏覽頁面,覺得速度真是快多了。
SQL分頁的儲存過程詳解
asp.net中的datagrid有內建分頁功能,但是它的預設的分頁方式效率是很低的,特別是在資料量很大的時候,用它內建的分頁功能幾乎是不可能的事,因為它會把所有的資料從資料庫讀出來再進行分頁,這種只選取了一小部分而丟掉大部分的方法是不可去取的.在最進的乙個專案中因為乙個管理頁面要管理的資料量非常大...
SQL分頁的儲存過程詳解
asp.net中的datagrid有內建分頁功能,但是它的預設的分頁方式效率是很低的,特別是在資料量很大的時候,用它內建的分頁功能幾乎是不可能的事,因為它會把所有的資料從資料庫讀出來再進行分頁,這種只選取了一小部分而丟掉大部分的方法是不可去取的.在最進的乙個專案中因為乙個管理頁面要管理的資料量非常大...
SQL分頁的儲存過程詳解
asp.net中的datagrid有內建分頁功能,但是它的預設的分頁方式效率是很低的,特別是在資料量很大的時候,用它內建的分頁功能幾乎是不可能的事,因為它會把所有的資料從資料庫讀出來再進行分頁,這種只選取了一小部分而丟掉大部分的方法是不可去取的.在最進的乙個專案中因為乙個管理頁面要管理的資料量非常大...