背景:
我正在使用 GridView 和 ObjectDataSource。我正在实现分页和排序。
在 ObjectDataSource 上:
objectDataSource.TypeName = value;
objectDataSource.SelectMethod = "Select";
objectDataSource.SelectCountMethod = "SelectCount";
objectDataSource.SortParameterName = "sortExpression";
objectDataSource.EnablePaging = true;
在 GridView 上:
gridView.AllowPaging = true;
gridView.AllowSorting = true;
gridView.DataSource = objectDataSource;
为了使分页和排序正常工作,我将“EnableSortingAndPagingCallbacks”设置为 True。之前,我收到“System.Web.HttpException:GridView 触发的事件排序未处理”。这解决了它。
如果我在我的 GridView 中只使用 BoundFields,这很好并且工作正常。
但是,如果我使用 TemplateFields,我会收到“NotSupportedException:TemplateField 不支持回调,因为某些控件无法在回调中正确更新。在 GridView 上关闭回调。”
这是有道理的。我只需要知道如何进行排序,而不使用 EnableSortingAndPagingCallbacks。
如果 EnableSortingAndPagingCallbacks = True:
- 寻呼工程
- 分拣作品
- BoundFields 工作
- 模板字段不起作用
如果 EnableSortingAndPagingCallbacks = False:
- 寻呼工程
- 排序不起作用_
- BoundFields 工作
- 模板字段工作
我的问题:
如何让分页、排序和模板字段同时工作?
关于实施的说明:
使用带有 GridView 的 ObjectDataSource 需要实现一个名为 Select 的方法,该方法提供排序表达式、要返回的行数和起始行:
public IEnumerable<CountyAndStateGridRow> Select(string sortExpression, int maximumRows, int startRowIndex)
{
string oql = "select County order by {" + sortExpression + "}" ;
var counties = QueryProvider.ExecuteQuery(oql).Cast<County>();
var page = counties.Skip(startRowIndex).Take(maximumRows);
var rows = page.Select(
county => new CountyAndStateGridRow
{
CountyName = county.Name,
StateName = county.State.Name,
});
return rows;
}
具体的 SortExpression 在 aspx/ascx 中定义:
<Columns>
<asp:BoundField HeaderText="County Name" DataField="CountyName" SortExpression="Name" />
<asp:BoundField HeaderText="State Name" DataField="StateName" SortExpression="State.Name" />
</Columns>
这应该在单击列时传入并调用 ObjectDataSource 上的 Select 方法,但如果 EnableSortingAndPagingCallbacks = true 似乎不起作用,而是我得到关于未定义排序事件的异常。