http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.sorting.aspx
本文首先介绍如何创建数据表,然后从中创建一个gridview,以帮助排序。我的困境略有不同。
我有一个Gridview,在Page_Load上,我将数据源设置为ArrayList,然后绑定。
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
this.GridView1.DataSource = RequestManager.Instance.GetAllRequests();
this.GridView1.DataBind();
}
}
现在我想对这个GridView进行排序,所以在aspx页面上,我设置了AllowSorting =“true”,并且OnSorting =“GridView1_Sorting”。到现在为止还挺好。我在BoundFields中设置了SortExpressions,当我点击它时,我知道_Sorting事件被触发了。
现在,由于这是一个回发操作,我不能简单地将gridview的数据源转换为DataTable进行排序。保存到ViewState是一个选项,但我无法弄清楚如何做到这一点。
我想在this page上使用简单的解决方案,除了DataTable不可用。谢谢你的期待。
答案 0 :(得分:0)
如果您能够定位.NET v3.5,我建议使用Linq。在_Sorting事件处理程序中,获取您在Page_Load中执行的数组列表并重新绑定它。
例如,如果数组列表中包含的类型是具有名为Default和SomeField的属性的MyType
个实例:
protected void Grid_Sorting(object sender, GridViewSortEventArgs e)
{
Func<MyType, object> keySelector;
if(e.SortExpresion == "SomeField")
{
keySelector = dataItem => dataItem.SomeField;
}
else
{
keySelector = dataItem => dataItem.Default;
}
ArrayList dataItems = RequestManager.Instance.GetAllRequests();
this.GridView1.DataSource = dataItems.OfType<MyType>().OrderBy(keySelector);
this.GridView1.DataBind();
}
这会让你开始,然后检查排序表达式,看它是以ASC还是DESC结束并有条件地调用.OrderByDescending(keySelector)
。
最后,我不建议在ViewState中存储列表,因为ObjectStateFormatter
仅针对少数类型进行了优化。 http://msdn.microsoft.com/en-us/library/system.web.ui.objectstateformatter.aspx
可能会考虑使用ASP.NET缓存。