0

我使用此 MSDN 链接中的代码在我的 GridView 上实现了排序,其中 DataTable 作为 DataSource 。但是,当我单击任何列时,我的网格第一次排序,之后它不会在单击任何其他列时排序。

PageLoad() 事件中的代码 -

if (!Page.IsPostBack)
{
      HView hv = new HView ();
      DataTable HTable = new DataTable("hTable");
      HTable = hv.FillTable();
      Session["hTable"] = HTable;
      GridView2.DataSource = Session["hTable"];
      GridView2.DataBind();
}    

排序事件中的代码 -

    protected void GridView2_Sorting(object sender, GridViewSortEventArgs e)
    {
        DataTable notesDT = Session["hTable"] as DataTable;
        if (notesDT != null)
        {                
            notesDT.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortDirection);                
            GridView2.DataSource = Session["hTable"];
            GridView2.DataBind();
        }
    }

有人知道我可能做错了什么吗?

编辑:我刚刚意识到这一点。如果我选择一个特定的行,我有另一个视图,其中填充了有关该行的详细信息。当我在尝试对任何列进行排序之前先查看一些行详细信息时,排序工作得非常好,任意次数。但是,如果我在选择一行之前尝试排序,它只能工作一次。

4

2 回答 2

0

您不需要将数据表存储到会话中。实际上将整个数据表放入会话中根本不是一个好主意。有什么特别的原因吗?

于 2012-05-10T18:02:03.223 回答
0

您在排序事件中使用DataTableas DataSource,但您应该改用排序视图。对视图进行排序不会改变表中数据的排序顺序,只会改变视图中的顺序。

protected void GridView2_Sorting(object sender, GridViewSortEventArgs e)
{
    DataTable notesDT = Session["hTable"] as DataTable;
    if (notesDT != null)
    {                
        notesDT.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortDirection);                
        GridView2.DataSource = notesDT.DefaultView;
        GridView2.DataBind();
    }
}

编辑:虽然我刚刚注意到您使用的是来自MSDN的相同代码。

您还可以尝试从视图中创建一个新的 DataTable:

GridView2.DataSource = notesDT.DefaultView.ToTable(true);
于 2012-05-10T15:03:52.130 回答