Sorting a gridview when databinding a collection or list of objects Sorting a gridview when databinding a collection or list of objects asp.net asp.net

Sorting a gridview when databinding a collection or list of objects


Thank you for your answers on the sorting. I turned to LINQ to help sort dynamically. Since the grid knows whether to sort ASC or DESC, and which field, I used a LINQ Expression. The Expression performed the sorting, and then I simply bound those results to my gridview.

I suspect the jQuery method would be faster, and wouldn't require a full postback.

using System.Linq.Expressions;public SortDirection GridViewSortDirection{    get    {        if (ViewState["sortDirection"] == null)            ViewState["sortDirection"] = SortDirection.Ascending;        return (SortDirection)ViewState["sortDirection"];    }    set { ViewState["sortDirection"] = value; }}protected void gridView_Sorting(object sender, GridViewSortEventArgs e){    //re-run the query, use linq to sort the objects based on the arg.    //perform a search using the constraints given     //you could have this saved in Session, rather than requerying your datastore    List<T> myGridResults = PerfomSearch();    if (myGridResults != null)    {        var param = Expression.Parameter(typeof(T), e.SortExpression);        var sortExpression = Expression.Lambda<Func<T, object>>(Expression.Convert(Expression.Property(param, e.SortExpression), typeof(object)), param);        if (GridViewSortDirection == SortDirection.Ascending)        {            myGridView.DataSource = myGridResults.AsQueryable<T>().OrderBy(sortExpression);            GridViewSortDirection = SortDirection.Descending;        }        else        {            myGridView.DataSource = myGridResults.AsQueryable<T>().OrderByDescending(sortExpression);            GridViewSortDirection = SortDirection.Ascending;        };        myGridView.DataBind();    }}


Correct - you will need to handle the onsorting, sort your list and re-bind.

Alternatively you could look at handling the sorting client side using a javascript framework like jQuery.


If you get this error:

the datasource does not support server side paging

Try adding .ToList<T>() to your query:

if (e.SortDirection == SortDirection.Ascending){    GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderBy(sortExpression).ToList<T>();}else{    GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderByDescending(sortExpression).ToList<T>();};