绑定LinqServerModeDataSource的ASPxGridView动态列排序失效如何解决
ASPxGridView动态生成列无法排序问题解决方案
问题根因定位
配置错误集中在以下几点:
- 每次排序触发的数据源查询回调都会清空GridView列并重走自动生成逻辑,完全丢失了列的排序状态
- 将IQueryable存入Session复用,而IQueryable只是查询表达式的封装,依赖创建它的数据源上下文,上下文销毁后后续排序查询无法正常执行
- 预先给IQueryable添加了固定排序逻辑,和LinqServerMode的动态排序逻辑冲突
- 自动生成的列可能没有正确继承全局排序配置
修复步骤
- 删除
LinqServerModeDataSourceForGrid_Selecting事件中操作GridView列的代码,同时不要复用Session里的IQueryable,每次查询时重新生成查询实例,调整后事件代码如下:
protected void LinqServerModeDataSourceForGrid_Selecting(object sender, DevExpress.Data.Linq.LinqServerModeDataSourceSelectEventArgs e) { e.KeyExpression = "Id"; // 替换为你业务逻辑里生成对应IQueryable的代码,不要复用Session存储的旧查询 var reportParameters = GetCurrentReportParameters(); // 自行实现参数获取逻辑 var reportInstance = new SmartFrame.Report.Client.TwentyLeastUsedItemsReport(reportParameters); reportInstance.InitializeReportData(reportInstance.FilterParameterDataList); e.QueryableSource = reportInstance.GetReportDataQueryable(); }
- 列自动生成逻辑仅在首次页面加载(非回发/非回调)时执行,可放在
Page_Load事件中:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack && !IsCallback) { ASPxGridViewData.Columns.Clear(); ASPxGridViewData.AutoGenerateColumns = true; } }
- 在
ASPxGridViewData_DataBound事件中手动给所有动态生成的列开启排序权限,确保配置生效:
protected void ASPxGridViewData_DataBound(object sender, EventArgs e) { foreach (GridViewColumn col in ASPxGridViewData.Columns) { if (col is GridViewDataColumn dataColumn) { dataColumn.AllowSort = DefaultBoolean.True; } } }
- 移除给IQueryable预先添加的
OrderBy语句,LinqServerMode会自行处理用户触发的排序逻辑,固定排序会覆盖动态排序效果。 - 确认你绑定的实体类所有展示属性都是
public修饰的可读写属性,LinqServerMode需要读取属性元数据生成排序查询表达式。
内容的提问来源于stack exchange,提问作者Emrealist
相关产品推荐
相关产品推荐

