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

时间:2009-03-05 23:04:09

标签: asp.net data-binding gridview sorting webforms

我按以下方式设置了GridView:

  • 绑定到代码隐藏中的List<T>(我使用自己的自定义BOL)
  • HTML页面上没有DataSource对象
  • 对我选择的每一列进行排序(SortExpression都已正确设置)

但是,我收到以下错误消息:

  

GridView“myGridView”已触发事件排序未处理。

List<T>允许排序的最佳方式是什么?

我怀疑它与指定OnSorting属性的函数有关,即:

OnSorting = "MySortingMethod"

5 个答案:

答案 0 :(得分:20)

感谢您对排序的答案。我转向LINQ以帮助动态排序。由于网格知道是否要对ASC或DESC进行排序,以及哪个字段,我使用了LINQ表达式。 Expression执行排序,然后我将这些结果绑定到gridview。

我怀疑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();
    }
}

答案 1 :(得分:2)

正确 - 您将需要处理onsorting,对列表进行排序并重新绑定。

或者你可以使用像jQuery这样的javascript框架来处理排序客户端。

答案 2 :(得分:2)

如果您收到此错误:

  

数据源不支持服务器端分页

尝试在查询中添加.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>();
};

答案 3 :(得分:1)

您可以为对象编写比较:

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;
}

然后在排序事件中,只需将Compare函数传递给对象排序例程(假设您有类似List的东西)。

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

您现在有一个排序列表,所以只需重新绑定它。

答案 4 :(得分:1)

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