Asp.net GridView作为数据表源仅第一次排序

Asp.net GridView作为数据表源仅第一次排序,asp.net,gridview,datatable,Asp.net,Gridview,Datatable,我在GridView上使用DataTable作为数据源,通过使用中的代码实现了排序。但是,当我单击任何列时,我的网格会第一次排序,之后它不会在单击任何其他列时排序 PageLoad()事件中的代码- 排序事件中的代码- 有人知道我可能做错了什么吗 编辑:我刚刚意识到这一点。如果我选择了一个特定的行,我会有另一个视图,其中会填充关于该行的详细信息。当我在尝试对任何列进行排序之前先查看一些行的详细信息时,排序可以非常好地工作,任何次数。但是,如果我在选择行之前尝试排序,它只工作一次。您在排序事件中使

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

PageLoad()事件中的代码- 排序事件中的代码- 有人知道我可能做错了什么吗


编辑:我刚刚意识到这一点。如果我选择了一个特定的行,我会有另一个视图,其中会填充关于该行的详细信息。当我在尝试对任何列进行排序之前先查看一些行的详细信息时,排序可以非常好地工作,任何次数。但是,如果我在选择行之前尝试排序,它只工作一次。您在排序事件中使用的是
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();
    }
}
编辑:尽管如此,我刚刚注意到您使用的是来自的相同代码

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

GridView2.DataSource = notesDT.DefaultView.ToTable(true);

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

您是否在
GridView2\u排序中设置了一个断点来查看它是否被调用,以及
Session[“hTable”]
是否为null?@TimSchmelter是的,我已经检查过了,Session[“hTable”]不是null,它第一次进行排序。。在那之后,它也不是空的,这就是让我困惑的地方,没有什么“似乎”错了……是的,我使用的是相同的代码。我也尝试过将排序视图作为数据源,但是网格仍然没有排序。@neuDev33:奇怪。尝试从排序视图中创建另一个表,就像我刚才添加的那样。我尝试了这个,但仍然没有排序。当我在调试模式下进行检查时,排序表达式和排序方向是正确的,我不确定还有什么地方会出错,导致此功能无法工作。我提到。你能告诉我一个更好的方法吗?或者,我至少希望当前版本能够正常工作,因为我也面临这方面的问题。@neuDev33:如果启用了ViewState,则根本不需要存储DataTable。然后,您只需要在第一次加载和排序、筛选、分页、更新等操作时提取数据,而不是在每次回发时提取数据。
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();
    }
}
GridView2.DataSource = notesDT.DefaultView.ToTable(true);