2010-12-23 36 views
-1

Cenario:
我有一個GridView綁定到一個DataSource,每列都是可排序的。
我的主要查詢是這樣的:ASP.Net Custom Paging(w/C#)

select a, b, c, d, e, f from table order by somedate desc 

我加了過濾器的形式,我可以定義值的字段中的每一個,並獲得其中的形式的結果。因此,我不得不做一個自定義排序,以便當我按字段排序時,我排序篩選的查詢,而不是主要的排序。 現在我要做的自定義分頁,出於同樣的原因,但我不明白它的理念:我要保證我可以:

  1. 過濾結果
  2. 排序列
  3. 當我點擊第2頁上,我得到的過濾和排序結果

我不知道我必須做兩頁,這樣我就可以綁定這個GV。我的排序方法,即工作得很好看起來像:

string condition = GetConditions(); //gets a string like " where a>1 and b>2" depending on the filter the user defines 
string query = "select a, b, c, d, e, f from table "; 
string direction = (e.SortDirection == SortDirection.Ascending)? "asc": "desc"; 
string order = " order by " + e.SortExpression + " " + direction; 
UtilizadoresDataSource.SelectCommand = query + condition + order; 

我從來沒有做過自定義分頁,我想:
GetConditions()//沒有問題,這裏
我怎麼能找到如何GridView被排序(通過什麼字段和排序順序)?

非常感謝你

回答

1

您可以使用ROW_NUMBER得到一個查詢返回的行數,然後篩選只有那些將可見對於給定的頁面元素。例如,您應該在select子句中添加ROW_NUMBER函數,並在where原因中添加過濾。

string condition = GetConditions(); //gets a string like " where a>1 and b>2" depending on the filter the user defines 
string query = "select ROW_NUMBER() OVER(ORDER BY " + order + ") a, b, c, d, e, f from table "; 
string direction = (e.SortDirection == SortDirection.Ascending)? "asc": "desc"; 
string order = " order by " + e.SortExpression + " " + direction; 
condition = condition + " RowNo BETWEEN ((@Page - 1) * @PageSize + 1) AND (@Page * @PageSize) " 
UtilizadoresDataSource.SelectCommand = query + condition + order; 

你可以找到一個更詳細的例子here。它還包含結合網格的示例項目。

P.S.我建議你創建一個存儲過程並從後面的代碼傳遞參數。這可以提高速度,也更容易維護。

+0

好吧,我曾考慮過這一點,但這與我在GridView中分頁時如何處理數據的先入爲主的觀念相矛盾。我認爲查詢是在沒有頁面限制的情況下對SQL進行的,並存儲在ASP端,當你分頁時,它只是瀏覽存儲的數據而不是再次查詢數據庫。 好吧,thanx無論如何:) – 2010-12-23 14:01:53