2012-08-08 105 views
0

大家好,我在排序GridView时遇到了问题。假设我的gridview有10行数据和2列,Name和Age。分页设置为每页5行数据。当我点击名称时,它被正确排序。但是,当我点击下一页时,它会再次变成“未分类”。请帮助!下面附加了事件处理程序。ASP.Net即使在进入下一页后对Gridview进行排序

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

和我pagechanging

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

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

我需要帮助,使以前的分类还梳理了下一个页面。请帮忙谢谢!

注意:我不想在绑定前对数据进行排序,因为我希望用户先看到数据,然后决定绑定什么。

+0

你是什么意思的“我希望用户先看到数据,然后决定要绑定什么”?我不明白为什么这会阻止你像'SearchResultGridView_Sorting'中那样设置'DefaultView.Sort'。 – Zhihao 2012-08-08 03:17:59

+0

这段代码是从我的团队中的其他开发人员复制而来的,我不知道他在做什么。无论如何,我的意思是,我不想在绑定数据时将其排序在SQL代码中。我想通过单击网格标题进行手动排序 – Theone 2012-08-08 03:21:12

+0

我遇到的麻烦是这行:string sortExpression = e.SortExpression; e不同 – Theone 2012-08-08 03:22:12

回答

2

您好像正在保存ViewState["SearchSort"]中的排序表达式。当您更改页面索引,值还是应该留在ViewState变量,所以你可以抓住它,并重新设置它:

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

虽然对数据进行排序之前,可能要拿到DataTable第一像所以:

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

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

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"]存在第一分配之前(如果没有,那么你可以把它的默认值)。

+0

谢谢您的回复!我是编程新手,所以是的:D,无论如何,我得到一个错误。第四行,ViewState [“SearchSort”]“无法将类型'Object'隐含转换为'String'。存在明确的转换(您是否缺少演员?)” – Theone 2012-08-08 03:43:43

+0

@Theone哦对不起,我忘记使用'的ToString()'。我更经常使用Visual Basic,它隐式地进行了转换(所以我经常因为懒惰而离开它)。我已经更正了我的答案。请让我知道这是否适合你。 – Zhihao 2012-08-08 03:50:58

+0

它现在可以编译,但现在它说..对象引用未设置为对象的实例。 'SearchDT.DefaultView.Sort = ViewState [“SearchSort”]。ToString();' – Theone 2012-08-08 05:50:24

相关问题