Сортировка сетки при привязке данных к коллекции или списку объектов

StackOverflow https://stackoverflow.com/questions/617088

Вопрос

У меня 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top