Как сортировать с помощью GridView и ObjectDataSource?
У меня есть GridView с ObjectDataSource
, и я хочу, чтобы его сортировать.
Пейджинг работает правильно, однако Сортировка дает мне исключение:
Событие Сортировка GridView gridView
, которое не обрабатывалось.
Как включить сортировку на стороне сервера?
(т.е. gridView.EnableSortingAndPagingCallbacks
должен оставаться ложным)
Ответы
Ответ 1
Установите для свойства 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, это не будет немедленно запущено, когда пользователь попытается сортировать, вместо этого он будет ждать возврата к серверу.
Надеюсь, это поможет!
EDIT:
Так как 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))
}
Ответ 2
Я использую Linq2Sql и объект ObjectDataSource, и он очень хорошо выполняет пейджинг и сортировку.
Я реализовал класс, который будет использоваться в качестве объекта ObjectDataSource. Он имеет метод Select и Count, вызывающий мой бизнес-уровень, который использует запросы Linq2SQL для извлечения данных из БД. Методы выбора автоматически получают первый индекс, размер страницы и выражение сортировки.
public List<EntityClass> Select(int startIndex, int pageSize, string sortBy) {}
public int Count() {}
В ASPX DataSource сконфигурирован следующим образом:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="Select" EnablePaging="true"
StartRowIndexParameterName="startIndex"
MaximumRowsParameterName="pageSize"
SortParameterName="sortBy" SelectCountMethod="Count" >
</asp:ObjectDataSource>
Метод Select и Count использует запросы Linq для извлечения данных из БД. Я использую методы Пропустить(), Take() и Orderby(). Для OrderBy, чтобы принять выражение сортировки строки, я использую DynamicLinq. Кодирование кода, привязка данных, пейджинг и сортировка не работают.
Ответ 3
Pass SortExpression
в способе уровня доступа к данным, который вызывает StoredProcedure
и напишите ниже путь SP для обработки сортировки по SQL. Таким образом, вы можете улучшить производительность сортировки.
База данных SP:
Select ROW_NUMBER() OVER(ORDER BY '+[email protected] +' ) as RowNum
,* from (SELECT CUSTOMERID,
LEDGERDESCRIPTION,
CustomerDescription as CustomerName
WHERE REGIONID ='''[email protected]+''')t
order by RowNum'
Ответ 4
Вы можете использовать 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 и хранимых процедур.