代码之家  ›  专栏  ›  技术社区  ›  p.campbell

在对对象集合或列表进行数据绑定时对网格视图进行排序

  •  14
  • p.campbell  · 技术社区  · 16 年前

    • List<T>
    • 可在我选择的每一列上排序( SortExpression

    我怀疑这与为 OnSorting 属性,即:

    OnSorting = "MySortingMethod"
    
    5 回复  |  直到 12 年前
        1
  •  20
  •   codeandcloud    14 年前

    感谢您对排序的回答。我求助于LINQ来帮助动态排序。由于网格知道是对ASC还是DESC进行排序,以及对哪个字段进行排序,我使用了LINQ表达式。表达式执行排序,然后我简单地将这些结果绑定到我的网格视图。

    我怀疑jQuery方法会更快,并且不需要完整的回发。

    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();
        }
    }
    
        2
  •  2
  •   brendan    16 年前

    正确-您需要处理启动、排序列表并重新绑定。

    或者,您可以考虑使用jQuery等javascript框架来处理排序客户端。

        3
  •  2
  •   Tim Cooper    13 年前

    如果您遇到此错误:

    尝试添加 .ToList<T>()

    if (e.SortDirection == SortDirection.Ascending)
    {
        GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderBy(sortExpression).ToList<T>();
    }
    else
    {
        GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderByDescending(sortExpression).ToList<T>();
    };
    
        4
  •  1
  •   Kelsey    16 年前

    你可以为你的对象写一个比较:

    private int CompareObject(YourObject object1, YourObject object2)
    {
        int iReturnValue = 0;
        if ((object1 != null) && (object2 != null) &&
            (object1.SomeField != object2.SomeField))
        {
            iReturnValue = (object1.SomeField > object2.SomeField) ? 1 : -1;
        }
        return iReturnValue;
    }
    

    // Your list of data from the session or viewstate or whereever you have it stored.
    lstObjects.Sort(CompareObject);
    

        5
  •  1
  •   Michael Kniskern    16 年前

    正确,您需要处理OnSorting事件并将AllowSorting属性设置为true。