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