使用数据表和作为ArrayList的数据源对gridview进行排序

时间:2012-11-13 23:02:35

标签: asp.net sorting gridview datatable postback

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不可用。谢谢你的期待。

1 个答案:

答案 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缓存。