我正在使用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:
如果EnableSortingAndPagingCallbacks = False:
如何让Paging,Sorting和TemplateField同时运行?
对实施的澄清:
将ObjectDataSource与GridView一起使用需要实现一个名为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它似乎不起作用,而是我得到关于排序事件未定义。
答案 0 :(得分:0)
属性EnableSortingAndPagingCallbacks告诉控件对数据进行客户端排序,以便控件看起来在没有页面回发的情况下自动排序。此方法不支持TemplateFields。为了使用TemplateFields并执行排序,您需要连接GridView.Sorting事件,并将AllowSorting属性设置为true。完成后,单击列标题时将触发该事件,并且可以从那里处理排序逻辑。
答案 1 :(得分:0)
用于排序功能:
<asp:GridView GridView ID="GvCountryDetails" AllowPaging="True"
OnPageIndexChanging="GvCountryDetails_PageIndexChanging" AllowSorting="True"
onsorting="GvCountryDetails_Sorting">
在.cs文件中你需要写
protected void GvCountryDetails_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GvCountryDetails.PageIndex = e.NewPageIndex;
isPageIndexChanged = true;
BindData();
}
protected void GvCountryDetails_Sorting(object sender, GridViewSortEventArgs e)
{
sortExpression = e.SortExpression;
isPageIndexChanged = false;
BindData();
}
private void SortGridData()
{
string sSortdir;
if (isPageIndexChanged == true)
{
sSortdir = ViewState["SortDirection"] as string;
}
else
{
sSortdir = GetSortDirection(sortExpression);
}
string sSortExp = sortExpression;
if (sSortdir == "ASC")
{
lstCountryDetails = Sort<Country>(lstCountryDetails, sSortExp, SortDirection.Ascending);
}
else
{
lstCountryDetails = Sort<Country>(lstCountryDetails, sSortExp, SortDirection.Descending);
}
}
private List<CountryBO> Sort<TKey>(List<CountryBO> list, string sortBy, SortDirection direction)
{
PropertyInfo property = list.GetType().GetGenericArguments()[0].GetProperty(sortBy);
if (direction == SortDirection.Ascending)
{
return list.OrderBy(e => property.GetValue(e, null)).ToList<CountryBO>();
}
else
{
return list.OrderByDescending(e => property.GetValue(e, null)).ToList<Country>();
}
}
private string GetSortDirection(string column)
{
string sortDirection = "ASC";
string sortExpression = ViewState["SortExpression"] as string;
if (sortExpression != null)
{
if (sortExpression == column)
{
string lastDirection = ViewState["SortDirection"] as string;
if ((lastDirection != null) && (lastDirection == "ASC"))
{
sortDirection = "DESC";
}
}
}
ViewState["SortDirection"] = sortDirection;
ViewState["SortExpression"] = column;
return sortDirection;
}
答案 2 :(得分:0)
使用DataField的值更改SortExpression值。 将AllowPaging和AllowSorting设置为true。 将EnableSortingAndPagingCallbacks设置为true。