Cenario:
我有一个绑定到DataSource的GridView,每列都是可排序的
我的主要查询类似于:
select a, b, c, d, e, f from table order by somedate desc
我添加了一个过滤器表单,我可以在其中为每个字段定义值并获取where表单的结果。因此,我必须进行自定义排序,以便当我按字段排序时,我正在排序过滤后的查询而不是主要查询。 现在我必须做自定义分页,出于同样的原因,但我不理解它的哲学:我想保证我能:
我不知道自己要做什么,所以我可以将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的排序方式(通过什么字段和排序顺序)?
非常感谢
答案 0 :(得分:1)
您可以使用ROW_NUMBER获取查询返回的行数,然后仅过滤那些对给定页面可见的元素。例如,您应该在select子句中添加ROW_NUMBER函数,并在where cause中添加过滤。
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。我建议你创建一个存储过程并从后面的代码中传递参数。这可以提高速度,也更容易维护。