Сортировка 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.