Asp.net 对集合或对象列表进行数据绑定时对gridview进行排序
我用以下方式设置了GridView:Asp.net 对集合或对象列表进行数据绑定时对gridview进行排序,asp.net,data-binding,gridview,sorting,webforms,Asp.net,Data Binding,Gridview,Sorting,Webforms,我用以下方式设置了GridView: 绑定到代码隐藏中的列表(我使用自己的自定义BOL) HTML页面上没有数据源对象 在我选择的每一列上可排序(所有SortExpressions都设置正确) 但是,我收到以下错误消息: GridView“myGridView”触发了未处理的事件排序 获取列表以允许排序的最佳方法是什么 我怀疑这与为排序属性指定函数有关,即: OnSorting = "MySortingMethod" 正确-您需要处理排序、排序列表并重新绑定 或者,您可以使用类似jQuer
- 绑定到代码隐藏中的
(我使用自己的自定义BOL)列表
- HTML页面上没有数据源对象
- 在我选择的每一列上可排序(所有
s都设置正确)SortExpression
列表
以允许排序的最佳方法是什么
我怀疑这与为排序属性指定函数有关,即:
OnSorting = "MySortingMethod"
正确-您需要处理排序、排序列表并重新绑定
或者,您可以使用类似jQuery的javascript框架来处理排序客户端。您可以为对象编写一个比较:
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;
}
然后,在排序事件中,只需将比较函数传递到对象排序例程中(假设您有类似列表的内容)
您现在有一个已排序的列表,只需重新绑定即可。正确,您需要处理OnSorting事件并将AllowSorting属性设置为true。感谢您对排序的回答。我转向LINQ来帮助动态排序。因为网格知道是对ASC还是DESC排序,以及哪个字段,所以我使用了LINQ表达式。表达式执行排序,然后我将这些结果绑定到我的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();
}
}
使用System.Linq.Expressions;
公共排序方向GridView排序方向
{
得到
{
if(ViewState[“sortDirection”]==null)
ViewState[“sortDirection”]=sortDirection.升序;
返回(SortDirection)视图状态[“SortDirection”];
}
设置{ViewState[“sortDirection”]=value;}
}
受保护的无效gridView_排序(对象发送器、GridViewSortEventArgs e)
{
//重新运行查询,使用linq根据参数对对象进行排序。
//使用给定的约束执行搜索
//您可以将其保存在会话中,而不是重新查询数据存储
List myGridResults=PerfomSearch();
if(myGridResults!=null)
{
var param=表达式参数(typeof(T),e.SortExpression);
var-sortExpression=Expression.Lambda(Expression.Convert(Expression.Property(param,e.sortExpression),typeof(object)),param);
if(GridViewSortDirection==SortDirection.Ascending)
{
myGridView.DataSource=myGridResults.AsQueryable().OrderBy(sortExpression);
GridViewSortDirection=SortDirection.Descending;
}
其他的
{
myGridView.DataSource=myGridResults.AsQueryable().OrderByDescending(sortExpression);
GridViewSortDirection=SortDirection.升序;
};
myGridView.DataBind();
}
}
如果出现此错误:
数据源不支持服务器端分页
尝试将.ToList()
添加到查询中:
if (e.SortDirection == SortDirection.Ascending)
{
GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderBy(sortExpression).ToList<T>();
}
else
{
GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderByDescending(sortExpression).ToList<T>();
};
if(e.SortDirection==SortDirection.升序)
{
GridViewTrackerLoans.DataSource=myGridResults.AsQueryable().OrderBy(sortExpression.ToList();
}
其他的
{
GridViewTrackerLoans.DataSource=myGridResults.AsQueryable().OrderByDescending(sortExpression.ToList();
};
非常有用,谢谢。。好奇地想看看这个方法是如何与Jquery一起工作的!Merci beaucoup..@p.campell:将方法稍微修改为GridViewe.SortDirection
始终返回SortDirection.Ascending
。希望你不介意
if (e.SortDirection == SortDirection.Ascending)
{
GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderBy(sortExpression).ToList<T>();
}
else
{
GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderByDescending(sortExpression).ToList<T>();
};