У меня есть gridview, что я хотел бы сортировать. Когда я определяю его так:
<asp:GridView ID="GridView1" runat="server" CssClass="gridview" DataSourceID="GridDataSource" AutoGenerateColumns="False" AllowSorting="True" >
Сортировка работает отлично. то есть. когда я нажимаю на заголовок столбца, сетка сортируется по этому столбцу.
Но когда я определяю это так:
<asp:GridView ID="GridView1" runat="server" CssClass="gridview" AutoGenerateColumns="False" AllowSorting="True" >
и в коде:
GridView1.DataSource = GridDataSource;
GridView1.DataBind();
Используя последний метод, сортировка не работает. Заголовки столбцов - это ссылки, но сетка не упорядочивает себя.
Я устанавливаю DataSource после загрузки страницы, чтобы пользователь мог выбирать из некоторых фильтров (выпадающих списков), чтобы ограничить возвращаемые записи.
Может ли кто-нибудь сказать мне, как установить источник данных в codebehind и получить функцию сортировки? Альтернативно, хороший способ остановить сетку от привязки данных при начальной загрузке страницы.
Чтобы получить автоматическую сортировку по asp.net gridview, вам понадобится несколько вещей.
Во-первых, вам нужно будет установить AllowSorting="True"
в теге gridview, который вы сделали.
Во-вторых, вам нужно правильно настроить свои Fields
. Поскольку у вас есть AutoGenerateColumns=false
вам нужно вручную указать SortExpression:
<asp:BoundFiled DataFiled="Name" HeaderText="Name" SortExpression="Name" />
В-третьих, вам нужно убедиться, что ваш источник данных поддерживает сортировку. Если данные привязаны непосредственно к DataSet, вы должны получить поддержку из коробки. Однако, если вы привязываетесь к objectdatasource или sqldatasource, вам необходимо убедиться, что ваш SelectMethod
поддерживает сортировку.
Например, для objectdatasource вам необходимо установить SortParameterName, а затем убедиться, что тот же параметр присутствует в коллекции SelectParameters:
<asp:ObjectDataSource ID="GridDataSource" runat="server"
SelectMethod="ExampleSelect"
TypeName="SO"
SortParameterName="sortExpression">
<SelectParameters>
<asp:Parameter Name="sortExpression" Type="String" />
</SelectParameters>
</asp:ObjectDataSource>
Тогда SelectMethod
будет отвечать за реализацию сортировки:
namesapce SO{
public class ExampleSelect{
public object[] ExampleSelect(string sortExpression)
{
var allItems = GetAllItems();
bool sortDesc =
//if sort descending, sortExpression will be suffixed with " DESC"
(sortExpression.Split(' ').Count() > 1);
if (sortExpression.StartsWith("Name"))
{
if (sortDesc)
return allItems.OrderByDescending(x => x.Name);
else
return allItems.OrderBy(x => x.Name);
}
else
{
return allItems;
}
}
}
}
Советы
Связывание данных в code_behind
Я рекомендую привязку данных декларативно в разметке с использованием одного из элементов управления источниками данных. Он избавляется от разного кода в коде позади и позволяет фреймворку иметь дело с тем, когда привязывается к databind, поэтому вам не нужно if (!IsPostBack)
утверждения if (!IsPostBack)
.