0

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.sorting.aspx

本文首先处理创建一个数据表,然后从中创建一个网格视图,以帮助进行排序。我的困境略有不同。

我有一个 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 是一种选择,但我不知道该怎么做。

我想使用此页面上的简单解决方案,但 DataTable 对我不可用。感谢您的关注。

4

1 回答 1

0

如果您能够以 .NET v3.5 为目标,我建议您使用 Linq。在您的 _Sorting 事件处理程序中,获取您在 Page_Load 中所做的数组列表并重新绑定它。

例如,如果数组列表中包含的类型是MyType具有名为 Default 和 SomeField 的属性的实例:

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

于 2012-11-14T02:20:32.093 回答