我使用来自this MSDN link的代码,使用DataTable作为DataSource在GridView上实现了排序。但是,当我单击任何列时,我的网格第一次排序,之后它不会对单击任何其他列进行排序。
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();
}
}
有没有人知道我可能做错了什么?
编辑:我刚刚意识到这一点。如果我选择一个特定的行,我会有另一个视图,其中包含有关该行的详细信息。当我在尝试对任何列进行排序之前首先查看某些行详细信息时,排序完全正常,任意次。但是,如果我在选择行之前尝试排序,它只能运行一次。答案 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)
您不需要将数据表存储到会话中。实际上将整个数据表放入会话根本不是一个好主意。有什么特别的原因吗?