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

У меня есть GridView с ObjectDataSource, и я хочу иметь возможность его отсортировать.

Пейджинг работает правильно, однако сортировка дает мне исключение:

Сортировка событий GridView gridView, которая не была обработана.

Как включить сортировку на стороне сервера?

(т. Е. gridView.EnableSortingAndPagingCallbacks должен оставаться ложным)

Ответы [ 4 ]

19 голосов
/ 16 июня 2009

Установите для свойства gridView.AllowSorting значение true. Отсюда сетка должна позволять вам автоматически сортировать данные при обратной передаче, если вы используете объект, который реализует IBindingList. Однако, поскольку это, скорее всего, не так, вам следует воспользоваться советом TheTXI выше и самостоятельно обработать событие сортировки. Либо подключите событие GridView.Sorting в коде, например так:

gridView.Sorting += new GridViewSortEventHandler(gridView_Sorting); 

Обработайте сортировку внутри метода gridView_Sorting, который должен выглядеть следующим образом:

private void gridView_Sorting(object sender, GridViewSortEventArgs e)
{
     //Sorting logic here
}

Кроме того, вы можете связать событие на самой странице, используя OnSort = "gridView_Sorting", прикрепленный к элементу управления.

Помните, поскольку вы устанавливаете gridView.EnableSortingAndPagingCallbacks в false, это не будет немедленно запущено, когда пользователь пытается выполнить сортировку, вместо этого он будет ожидать обратной передачи на сервер.

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ:

Поскольку ObjectDataSource, по-видимому, является предпочтительным посредником, вот краткое объяснение подключения, которое также подходит для сортировки. Используйте следующую информацию на своей странице (полный пример можно найти здесь в MSDN, внизу):

<asp:GridView ID="TestGridView" runat="server" DataSourceID="ObjectDataSourceTest"
        AllowSorting="True">
    </asp:GridView>
    <asp:ObjectDataSource ID="ObjectDataSourceTest" runat="server" 
        SelectMethod="SelectMethod" 
        TypeName="Samples.AspNet.CS.SortingData" 
        SortParameterName="sortExpression">
    </asp:ObjectDataSource>

Вместо того, чтобы фактически использовать событие gridView.Sorting, вы будете перепрыгивать на ObjectDataSource, чтобы позаботиться о сортировке. Как только сортировка запущена, она должна вызвать метод, найденный в SelectMethod в вашем коде. Затем внутри SelectMethod вы будете обрабатывать восстановление вашего объекта GridView, которое будет выглядеть следующим образом:

public void SelectMethod(string sortExpression)
{
     //Rebuild gridView table if necessary, same method used in 
     //on a postback, and retrieve data from the database. Once
     //completed sort the data with:

     gridView.Sort(sortExpression, SortDirection.(Ascending or Descending))
}
7 голосов
/ 11 июня 2010

Я использую Linq2Sql и ObjectDataSource, и он очень хорошо справляется с поиском и сортировкой.

Я реализовал Class для использования в качестве ObjectDataSource. У него есть метод Select и Count, вызывающий мой бизнес-уровень, который использует Linq2SQL запросы для извлечения данных из БД. Методы выбора автоматически получают индекс первого элемента, размер страницы и выражение сортировки в качестве параметров.

public List<EntityClass> Select(int startIndex, int pageSize, string sortBy) {}
public int Count() {}

В ASPX источник данных настроен так:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"  
     SelectMethod="Select" EnablePaging="true"
     StartRowIndexParameterName="startIndex" 
     MaximumRowsParameterName="pageSize"
     SortParameterName="sortBy" SelectCountMethod="Count" >   
</asp:ObjectDataSource>

Методы Select и Count используют запросы Linq для извлечения данных из БД. Я использую методы Skip (), Take () и Orderby () . Для того, чтобы OrderBy принял выражение сортировки строк, я использую DynamicLinq Не так много кода, автоматическое связывание, подкачка страниц и сортировка.

2 голосов
/ 19 июня 2012

Pass SortExpression в методе уровня доступа к данным, который вызывает StoredProcedure и напишите ниже способ SP для обработки сортировки по SQL. Таким образом, вы можете улучшить производительность вашей сортировки.

База данных SP:

Select ROW_NUMBER() OVER(ORDER BY   '+@sortExpression +' ) as RowNum
,* from (SELECT CUSTOMERID,  
LEDGERDESCRIPTION,  
CustomerDescription as CustomerName
WHERE REGIONID ='''+@RegionID+''')t
order by RowNum'
0 голосов
/ 04 декабря 2014

Вы можете использовать LINQ для этого просто используйте OrderBy в выбранном столбце, сделайте это:

    public static List<YourDataObject> GetSortedData(string orderBy)
    {
        List<YourDataObject> sortedDataList = new List<YourDataObject>();

        switch (orderBy)
        {
            case "Col1": sortedEmployeeList = GetDefaultObjects().OrderBy(x => x.Col1).ToList();
                break;
            case "Col2": 
                         //Do this for all columns
            default:
                sortedEmployeeList = GetDefaultObjects();
                break;
        }

        return sortedEmployeeList;
    }

Это делается в методе Select источника данных объекта.

В GridView добавьте ключи сортировки. И добавьте SelectParameter в источник данных объекта `orderBy '

<asp:GridView AllowSorting="true" DataSourceID="objDsAllObjects" ....>
<Columns>
         <asp:BoundField SortExpression="Col1"/>
         <!-- Do this for all columns -->
</Columns>
</asp:GridView >

<asp:ObjectDataSource ID="objDsAllObjects" SortParameterName="orderBy" runat="server" 
SelectMethod="GetAllEmployees" TypeName="YourObjectClass"></asp:ObjectDataSource>

Это сработало у меня без изменения слоя DAL и хранимых процедур.

...