Сортировка gridview при привязке данных к коллекции или списку объектов
У меня есть GridView, настроенный следующим образом:
- привязан к
List<T>
в кодировке (я использую свой собственный BOL)
- Нет объекта DataSource на странице HTML
- сортируется по каждому выбранному столбцу (все
SortExpression
установлены правильно)
Однако я получаю следующее сообщение об ошибке:
Не удалось обработать событие сортировки GridView 'myGridView' Сортировка, которая не обрабатывалась.
Каков наилучший способ заставить меня List<T>
разрешить сортировку?
Я подозреваю, что это будет связано с определением функции для атрибута OnSorting
, то есть:
OnSorting = "MySortingMethod"
Ответы
Ответ 1
Спасибо за ваши ответы на сортировку. Я обратился к 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();
}
}
Ответ 2
Правильно - вам нужно будет обработать onsorting, отсортировать список и повторно привязать.
В качестве альтернативы вы можете посмотреть обработку клиентской части сортировки с использованием инфраструктуры javascript, например jQuery.
Ответ 3
Если вы получите эту ошибку:
источник данных не поддерживает подкачку на стороне сервера
Попробуйте добавить .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
Вы можете написать Сравнить для своих объектов:
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);
Теперь у вас есть отсортированный список, поэтому просто переформатируйте его.
Ответ 5
Правильно, вам нужно обработать событие OnSorting и установить для свойства AllowSorting значение true.