2009-03-05 3 views
12

У меня есть GridView настроить следующим образом:Сортировка GridView при привязки данных коллекции или список объектов

  • привязанного к List<T> в код-за (я использую свой собственный пользовательский BOL)
  • нет DataSource объекта на 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

Usefull, спасибо .. Любопытно посмотреть, как работает метод с Jquery! Merci beaucoup .. – bAN

+4

@ p.campell: слегка изменен метод, так как GridView 'e.SortDirection' всегда возвращает' SortDirection.Ascending'. надеюсь, что ты не против – naveen

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>(); 
}; 
Смежные вопросы