2009-03-05 132 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>(); 
};