我按以下方式设置了GridView:
List<T>
(我使用自己的自定义BOL)SortExpression
都已正确设置)但是,我收到以下错误消息:
GridView“myGridView”已触发事件排序未处理。
让List<T>
允许排序的最佳方式是什么?
我怀疑它与指定OnSorting
属性的函数有关,即:
OnSorting = "MySortingMethod"
答案 0 :(得分:20)
感谢您对排序的答案。我转向LINQ以帮助动态排序。由于网格知道是否要对ASC或DESC进行排序,以及哪个字段,我使用了LINQ表达式。 Expression执行排序,然后我将这些结果绑定到gridview。
我怀疑jQuery方法会更快,并且不需要完整的回发。
using System.Linq.Expressions;
public SortDirection GridViewSortDirection
{
get
{
if (ViewState["sortDirection"] == null)
ViewState["sortDirection"] = SortDirection.Ascending;
return (SortDirection)ViewState["sortDirection"];
}
set { ViewState["sortDirection"] = value; }
}
protected void gridView_Sorting(object sender, GridViewSortEventArgs e)
{
//re-run the query, use linq to sort the objects based on the arg.
//perform a search using the constraints given
//you could have this saved in Session, rather than requerying your datastore
List<T> myGridResults = PerfomSearch();
if (myGridResults != null)
{
var param = Expression.Parameter(typeof(T), e.SortExpression);
var sortExpression = Expression.Lambda<Func<T, object>>(Expression.Convert(Expression.Property(param, e.SortExpression), typeof(object)), param);
if (GridViewSortDirection == SortDirection.Ascending)
{
myGridView.DataSource = myGridResults.AsQueryable<T>().OrderBy(sortExpression);
GridViewSortDirection = SortDirection.Descending;
}
else
{
myGridView.DataSource = myGridResults.AsQueryable<T>().OrderByDescending(sortExpression);
GridViewSortDirection = SortDirection.Ascending;
};
myGridView.DataBind();
}
}
答案 1 :(得分:2)
正确 - 您将需要处理onsorting,对列表进行排序并重新绑定。
或者你可以使用像jQuery这样的javascript框架来处理排序客户端。
答案 2 :(得分:2)
如果您收到此错误:
数据源不支持服务器端分页
尝试在查询中添加.ToList<T>()
:
if (e.SortDirection == SortDirection.Ascending)
{
GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderBy(sortExpression).ToList<T>();
}
else
{
GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderByDescending(sortExpression).ToList<T>();
};
答案 3 :(得分:1)
您可以为对象编写比较:
private int CompareObject(YourObject object1, YourObject object2)
{
int iReturnValue = 0;
if ((object1 != null) && (object2 != null) &&
(object1.SomeField != object2.SomeField))
{
iReturnValue = (object1.SomeField > object2.SomeField) ? 1 : -1;
}
return iReturnValue;
}
然后在排序事件中,只需将Compare函数传递给对象排序例程(假设您有类似List的东西)。
// Your list of data from the session or viewstate or whereever you have it stored.
lstObjects.Sort(CompareObject);
您现在有一个排序列表,所以只需重新绑定它。
答案 4 :(得分:1)
正确,您需要处理OnSorting事件并将AllowSorting属性设置为true。