2009-03-05 74 views
12

的名单排序时一个gridview我有一个GridView以下列方式设置:数据绑定的集合或对象

  • 在后台代码绑定到List<T>(我用我自己的自定义BOL)
  • HTML页面
  • 排序上,我选择(在SortExpression s的所有设置正确),每列

但是上没有数据源对象,我收到以下错误消息:

The GridView 'myGridView' fired event Sorting which wasn't handled.

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

我怀疑它会与指定为OnSorting属性的功能做的,即:

OnSorting = "MySortingMethod" 

回答

19

谢谢你的排序答案。我转向LINQ来帮助动态排序。由于网格知道是否对ASC或DESC进行排序,以及哪个字段,我使用了LINQ表达式。表达式执行排序,然后我简单地将这些结果绑定到我的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(); 
    } 
} 
+0

有用的,感谢..好奇,想看看如何用jQuery工作方法! Merci beaucoup .. – bAN 2010-12-08 09:36:55

2

正确的 - 你将需要处理的onsorting,排序列表并重新绑定。

另外,你可以看看处理排序客户端使用JavaScript框架,如jQuery。

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

然后在你的事件排序时比较功能只是传递到你的对象排序过程(假设你有这样的事情列表)。

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

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

1

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

2

如果您收到此错误:

the datasource does not support server side paging

尝试增加.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>(); 
};