2012-08-08 103 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

相關問題