【问题标题】:ASP.Net Sorting a Gridview even after going to next page即使在转到下一页后,ASP.Net 也会对 Gridview 进行排序
【发布时间】:2012-08-08 03:06:34
【问题描述】:

大家好,我的 gridview 排序有问题。假设我的gridview 有10 行数据和2 列,名称和年龄。分页设置为每页 5 行数据。当我单击名称时,它已正确排序。但是,当我单击下一页时,它再次变为“未排序”。请帮忙!我在下面附上了事件处理程序。

    protected void SearchResultGridView_Sorting(object sender, GridViewSortEventArgs e)
    {
        if (ViewState["SearchDS"] == null)
            Response.Redirect("PESearh.aspx");
        DataTable SearchDT = ((DataSet)ViewState["SearchDS"]).Tables[0];

        string sortExpression = e.SortExpression;

        if (ViewState["SearchSort"] != null && ViewState["SearchSort"].ToString().Length > 0)
        {
            if (!ViewState["SearchSort"].ToString().Contains(sortExpression))
                GridViewSortDirection = SortDirection.Descending;
        }
        else
        {
            GridViewSortDirection = SortDirection.Descending;
        }

        if (GridViewSortDirection == SortDirection.Ascending)
        {
            GridViewSortDirection = SortDirection.Descending;
            sortExpression += " DESC";
            SearchDT.DefaultView.Sort = sortExpression;
        }
        else
        {
            GridViewSortDirection = SortDirection.Ascending;
            sortExpression += " ASC";
            SearchDT.DefaultView.Sort = sortExpression;
        }
        ViewState["SearchSort"] = sortExpression;

        this.SearchResultGridView.DataSource = SearchDT;
        this.SearchResultGridView.DataBind();
    }

对于我的换页

    protected void SearchResultGridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        SearchResultGridView.DataSource = ViewState["SearchDS"];

        SearchResultGridView.PageIndex = e.NewPageIndex;
        SearchResultGridView.DataBind();
    }

我需要帮助,以便先前的排序也对下一页进行排序。请帮忙谢谢!

注意:我不想在绑定之前对数据进行排序,因为我希望用户先看到数据,然后再决定要绑定的内容。

【问题讨论】:

  • “我希望用户先看到数据,然后再决定绑定什么”是什么意思?我不明白为什么这会阻止您像在SearchResultGridView_Sorting 中那样设置DefaultView.Sort
  • 这段代码是从我团队的另一位开发人员那里复制而来的,我不知道他在做什么。无论如何我的意思是,我不想在绑定数据时在 SQL 代码中对其进行排序。我只想通过单击网格标题进行手动排序
  • 我遇到的麻烦在于这一行:string sortExpression = e.SortExpression; e 不同

标签: c# asp.net gridview


【解决方案1】:

您似乎将排序表达式保存在ViewState["SearchSort"] 中。当您更改页面索引时,该值仍应保留在 ViewState 变量中,因此您可以抓住它并再次设置它:

SearchDT.DefaultView.Sort = ViewState["SearchSort"].ToString();

不过,在对数据进行排序之前,可能需要先获取DataTable,如下所示:

DataTable SearchDT = ((DataSet)ViewState["SearchDS"]).Tables[0];

然后,您可以使用新的DataTable,而不是直接将GridViewDataSource 分配给ViewState["SearchDS"]

SearchResultGridView.DataSource = SearchDT;

一起,你有这样的事情:

protected void SearchResultGridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    DataTable SearchDT = ((DataSet)ViewState["SearchDS"]).Tables[0];
    SearchDT.DefaultView.Sort = ViewState["SearchSort"].ToString();
    SearchResultGridView.DataSource = SearchDT;

    SearchResultGridView.PageIndex = e.NewPageIndex;
    SearchResultGridView.DataBind();
}

但为了安全起见,您可能需要在分配之前先检查以确保 ViewState["SearchSort"] 存在(如果不存在,则可以给它一个默认值)。

【讨论】:

  • 感谢您的回复!我是编程新手,所以是的:D,无论如何,我得到一个错误。第 4 行,ViewState["SearchSort"] "无法将类型 'Object' 隐式转换为 'String'。存在显式转换。(您是否缺少演员表?)"
  • @Theone 哦,对不起,我忘了使用ToString()。我更频繁地使用 Visual Basic,它隐式地进行转换(所以我经常因为懒惰而忽略它)。我已经通过更正更新了我的答案。请让我知道这是否适合您。
  • 它现在可以编译,但现在它说.. 对象引用未设置为对象的实例。 SearchDT.DefaultView.Sort = ViewState["SearchSort"].ToString();
猜你喜欢
  • 2023-04-03
  • 2012-11-02
  • 2017-12-14
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
相关资源
最近更新 更多