Как отсортировать в GridView, используя ObjectDataSource с TemplateFields - PullRequest
7 голосов
/ 16 июня 2009

Справочная информация:

Я работаю с GridView и ObjectDataSource. Я использую пейджинг и сортировку.

В источнике ObjectData:

        objectDataSource.TypeName = value;
        objectDataSource.SelectMethod = "Select";
        objectDataSource.SelectCountMethod = "SelectCount";
        objectDataSource.SortParameterName = "sortExpression";
        objectDataSource.EnablePaging = true;

На GridView:

        gridView.AllowPaging = true;
        gridView.AllowSorting = true;
        gridView.DataSource = objectDataSource;

Чтобы пейджинг и сортировка работали, я установил «EnableSortingAndPagingCallbacks» в True. Раньше я получал «System.Web.HttpException: сортировка запускаемых событий GridView, которая не была обработана». и это исправляет.

Если я использую только BoundFields в моем GridView, это замечательно и отлично работает.

Однако, если я использовал TemplateFields, я получаю «NotSupportedException: обратные вызовы не поддерживаются в TemplateField, поскольку некоторые элементы управления не могут корректно обновляться в обратном вызове. Отключите обратные вызовы в GridView.»

Что, имеет смысл. Мне просто нужно знать, как заставить работать сортировку без использования EnableSortingAndPagingCallbacks.

Если EnableSortingAndPagingCallbacks = True:

  • Пейджинговые работы
  • Сортировочные работы
  • Работа BoundFields
  • TemplateFields делают Не Работа

Если EnableSortingAndPagingCallbacks = False:

  • Пейджинговые работы
  • Сортировка Не Работа
  • Работа BoundFields
  • Работа с TemplateFields

Мой вопрос:

Как мне заставить работать пейджинг, сортировку и TemplateFields одновременно,


Разъяснения по реализации:

Использование ObjectDataSource с GridView требует реализации метода Select, который предоставляет выражение сортировки, количество возвращаемых строк и начальную строку:

    public IEnumerable<CountyAndStateGridRow> Select(string sortExpression, int maximumRows, int startRowIndex)
    {
        string oql = "select County order by {" + sortExpression + "}" ;

        var counties = QueryProvider.ExecuteQuery(oql).Cast<County>();

        var page = counties.Skip(startRowIndex).Take(maximumRows);

        var rows = page.Select(
            county => new CountyAndStateGridRow
            {
                CountyName = county.Name,
                StateName = county.State.Name,
            });

        return rows;
    }

Определенное выражение SortExpression определено в aspx / ascx:

<Columns>
       <asp:BoundField HeaderText="County Name" DataField="CountyName" SortExpression="Name" />
       <asp:BoundField HeaderText="State Name" DataField="StateName" SortExpression="State.Name" />
</Columns>

Это , предполагается, что будет передано и вызовет метод Select для ObjectDataSource при щелчке по столбцу, но, похоже, он не работает, если EnableSortingAndPagingCallbacks = true, и вместо этого я получаю исключение о Событие сортировки не определено.

Ответы [ 3 ]

0 голосов
/ 06 июня 2014

Для работы функции сортировки:

 <asp:GridView GridView ID="GvCountryDetails" AllowPaging="True" 
OnPageIndexChanging="GvCountryDetails_PageIndexChanging" AllowSorting="True" 
onsorting="GvCountryDetails_Sorting">

в .cs файле, который нужно написать

protected void GvCountryDetails_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        GvCountryDetails.PageIndex = e.NewPageIndex;
        isPageIndexChanged = true;
        BindData();
    }

protected void GvCountryDetails_Sorting(object sender, GridViewSortEventArgs e)
    {
        sortExpression = e.SortExpression;
        isPageIndexChanged = false;
        BindData();
    }
    private void SortGridData()
    {
        string sSortdir;
        if (isPageIndexChanged == true)
        {
            sSortdir = ViewState["SortDirection"] as string;
        }
        else
        {
            sSortdir = GetSortDirection(sortExpression);
        }

        string sSortExp = sortExpression;

        if (sSortdir == "ASC")
        {
            lstCountryDetails = Sort<Country>(lstCountryDetails, sSortExp, SortDirection.Ascending);
        }
        else
        {
            lstCountryDetails = Sort<Country>(lstCountryDetails, sSortExp, SortDirection.Descending);
        }
    }

    private List<CountryBO> Sort<TKey>(List<CountryBO> list, string sortBy, SortDirection direction)
    {
        PropertyInfo property = list.GetType().GetGenericArguments()[0].GetProperty(sortBy);
        if (direction == SortDirection.Ascending)
        {
            return list.OrderBy(e => property.GetValue(e, null)).ToList<CountryBO>();
        }
        else
        {
            return list.OrderByDescending(e => property.GetValue(e, null)).ToList<Country>();
        }
    }

    private string GetSortDirection(string column)
    {
        string sortDirection = "ASC";
        string sortExpression = ViewState["SortExpression"] as string;
        if (sortExpression != null)
        {
            if (sortExpression == column)
            {
                string lastDirection = ViewState["SortDirection"] as string;
                if ((lastDirection != null) && (lastDirection == "ASC"))
                {
                    sortDirection = "DESC";
                }
            }
        }

        ViewState["SortDirection"] = sortDirection;
        ViewState["SortExpression"] = column;
        return sortDirection;
    }
0 голосов
/ 25 июля 2014

Измените значение SortExpression на значение DataField. Установите для AllowPaging и AllowSorting значение true. Установите для параметра EnableSortingAndPagingCallbacks значение true.

0 голосов
/ 17 июня 2009

Свойство EnableSortingAndPagingCallbacks указывает элементу управления выполнить сортировку данных на стороне клиента, чтобы элемент управления автоматически сортировался без обратной передачи страницы. TemplateFields не поддерживаются этим методом. Чтобы использовать TemplateFields и выполнить сортировку, необходимо подключить событие GridView.Sorting и установить для свойства AllowSorting значение true. Как только это будет сделано, событие должно сработать при щелчке по заголовку столбца и оттуда можно будет обработать логику сортировки.

...