




дополнительную информацию о сортировке в представлении сетки можно найти здесь: Сортировка MSDN Gridview методология, используемая для получения данных, не имеет значения, вы можете использовать ту же сортировку.
добавлять:
AllowSorting = "true"
к тегу <asp:GridView />, который должен это сделать
Если вы просто сделаете это, выдает ошибку The GridView 'GridView1' fired event Sorting which wasn't handled.
When I do that Alone it gives an error "The GridView 'GridView1' fired event Sorting which wasn't handled.
У меня такое случалось раньше ... Я только что создал одноразовый обработчик, и после этого все, казалось, начало работать. Не самое красивое решение, но у меня оно сработало.
Тем не менее, я не видел ссылки на источник данных в вашем коде GridView. Вам понадобится что-то вроде этого:
<asp:LinqDataSource ID = "dsMyDataSource" runat = "server"
DataContextTypeName = "MyDataContext"
TableName = "MyTable"
AllowSort = "true" />
А затем в вашем GridView:
<asp:GridView ID = "gvMyGridView" runat = "server" DataSourceID = "dsMyDataSource" ... />
На панели свойств дважды щелкните элемент «Сортировка». Будет создана новая функция. В этой функции напишите код для заполнения таблицы. Единственное отличие - изменить запрос на основе GridViewSortEventArgs e
e.SortExpression
и
e.SortDirection всегда по возрастанию :-(
Я надеюсь, что этот очень короткий ответ поможет
Половинный псевдокод для SQL-запроса
string Query= string.Empty;
string SortExpression = string.Empty;
// HDFSort is an HiddenField !!!
protected void SortCommand_OnClick(object sender, GridViewSortEventArgs e)
{
SortExpression = e.SortExpression;
Query = YourQuery + " ORDER BY "+SortExpression +" "+ HDFSort.Value ;
HDFSort.Value = HDFSort.Value== "ASC" ? "DESC" : "ASC";
RefreshGridView();
}
protected void RefreshGridView()
{
GridView1.DataSource = DBObject.GetData(Query);
GridView1.DataBind();
}
Чтобы сделать это правильно, вам нужно сделать 2 вещи.
Вручную обработайте событие Сортировка в сетке и используйте этот помощник, который я написал для сортировки по SortExpression и SortDirection:
public static IQueryable<T> SortBy<T>(IQueryable<T> source, string sortExpression, SortDirection direction) {
if (source == null) {
throw new ArgumentNullException("source");
}
string methodName = "OrderBy";
if (direction == SortDirection.Descending) {
methodName += "Descending";
}
var paramExp = Expression.Parameter(typeof(T), String.Empty);
var propExp = Expression.PropertyOrField(paramExp, sortExpression);
// p => p.sortExpression
var sortLambda = Expression.Lambda(propExp, paramExp);
var methodCallExp = Expression.Call(
typeof(Queryable),
methodName,
new[] { typeof(T), propExp.Type },
source.Expression,
Expression.Quote(sortLambda)
);
return (IQueryable<T>)source.Provider.CreateQuery(methodCallExp);
}
db.Products.SortBy (e.SortExpression, e.SortDirection)
Посмотрите мой пост в блоге, как это сделать:
Как ваш метод сортировки может обрабатывать подобъекты. Например. у вас есть объект Order, который содержит order.comment.rating, и вы хотите отсортировать его по рейтингу?
Вам придется вручную пройтись по точкам переданного sortExpression. Довольно тривиально изменить код, чтобы справиться с этим.
Статья MSDN работает отлично, за исключением того, что вам нужно изменить одну строку кода в файле .cs:
string header = ((Binding)headerClicked.Column.DisplayMemberBinding).Path.Path;Код в MSDN, сортировка будет работать только в том случае, если заголовок и имя столбца точно такие же.