Сортировка вида сетки при привязке данных к коллекции или списку объектов - PullRequest
13 голосов
/ 06 марта 2009

GridView настроен следующим образом:

  • привязан к List<T> в коде (я использую свой собственный BOL)
  • нет объекта DataSource на странице HTML
  • сортируется по каждому выбранному мной столбцу (SortExpression все настроены правильно)

Однако я получаю следующее сообщение об ошибке:

Сортировка сгенерированного события 'myGridView' GridView, которая не была обработана.

Каков наилучший способ заставить мой List<T> разрешить сортировку?

Я подозреваю, что это будет связано с указанием функции для атрибута OnSorting, т. Е .:

OnSorting = "MySortingMethod"

Ответы [ 5 ]

20 голосов
/ 06 марта 2009

Спасибо за ваши ответы по сортировке. Я обратился к 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();
    }
}
2 голосов
/ 14 января 2011

Если вы получите эту ошибку:

источник данных не поддерживает подкачку на стороне сервера

Попробуйте добавить .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>();
};
2 голосов
/ 06 марта 2009

Правильно - вам нужно обработать сортировку, отсортировать список и выполнить повторную привязку.

В качестве альтернативы вы можете посмотреть на обработку клиентской сортировки, используя javascript-фреймворк, например jQuery.

1 голос
/ 06 марта 2009

Правильно, вам нужно обработать событие OnSorting и установить для свойства AllowSorting значение true.

1 голос
/ 06 марта 2009

Вы можете написать сравнение для ваших объектов:

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;
}

Затем, когда вы используете событие сортировки, просто передайте функцию сравнения в процедуру сортировки объектов (при условии, что у вас есть что-то вроде List).

// Your list of data from the session or viewstate or whereever you have it stored.
lstObjects.Sort(CompareObject);

Теперь у вас есть отсортированный список, так что просто перепишите его.

...