GridView作为DataTable源仅首次排序

时间:2012-05-10 14:49:45

标签: asp.net gridview datatable

我使用来自this MSDN link的代码,使用DataTable作为DataSource在GridView上实现了排序。但是,当我单击任何列时,我的网格第一次排序,之后它不会对单击任何其他列进行排序。

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();
        }
    }

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

编辑:我刚刚意识到这一点。如果我选择一个特定的行,我会有另一个视图,其中包含有关该行的详细信息。当我在尝试对任何列进行排序之前首先查看某些行详细信息时,排序完全正常,任意次。但是,如果我在选择行之前尝试排序,它只能运行一次。

2 个答案:

答案 0 :(得分:0)

您在排序事件中使用DataTable作为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);

答案 1 :(得分:0)

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