2014-01-20 33 views
4

我使用的是對asp.net gridview進行排序,並設置好了所有東西,但它不起作用。這些列甚至沒有像正常一樣加下劃線,點擊什麼都沒有發生。爲什麼我的排序不起作用?

網格:

<asp:GridView ID="gvResults" runat="server" Width="100%" AllowSorting="True" OnSorting="gvResults_Sorting" AutoGenerateColumns="False" CssClass="tblBrowse"> 

排序:

protected void gvResults_Sorting(object sender, GridViewSortEventArgs e) 
     { 
      try 
      { 
       DataTable dtSortTable = gvResults.DataSource as DataTable; 

       if (dtSortTable != null) 
       { 
        DataView dvSortedView = new DataView(dtSortTable); 

        dvSortedView.Sort = e.SortExpression + " " + ConvertSortDirection(e.SortDirection); 

        gvResults.DataSource = dvSortedView; 
        gvResults.DataBind(); 

       } 
      } 
      catch (Exception ex) 
      { 
       ExceptionHandling.NETException(ex, constPageID, constIsSiteSpecific); 
      } 
     } 

轉換排序方向:

private string ConvertSortDirection(SortDirection sortDirection) 
     { 
      string newSortDirection = string.Empty; 

      switch (sortDirection) 
      { 
       case SortDirection.Ascending: 
        newSortDirection = "ASC"; 
        break; 

       case SortDirection.Descending: 
        newSortDirection = "DESC"; 
        break; 
      } 

      return newSortDirection; 
     } 
+0

您是否爲每列設置了「SortExpression」屬性? – ekad

+0

你檢查過你的page_load是否正常?這意味着你只能在非回發情況下進行綁定... – deostroll

+0

@ekad我應該在排序表達式中輸入什麼內容? – connersz

回答

3

設置SortExpression屬性爲每個列。例如SortExpression="Column1"表示按Column1,SortExpression="Column2"排序,表示按Column2排序,依此類推。這裏的ASPX代碼看起來應該像:

<asp:GridView ID="gvResults" runat="server" Width="100%" AllowSorting="True" OnSorting="gvResults_Sorting" AutoGenerateColumns="False" CssClass="tblBrowse"> 
    <Columns> 
     <asp:BoundField DataField="Column1" SortExpression="Column1" /> 
     <asp:BoundField DataField="Column2" SortExpression="Column2" /> 
    </Columns> 
</asp:GridView> 

我們需要保持回發之間的最後排序表達式和排序方向,所以這兩個屬性需要:

private string SortExpression 
{ 
    get 
    { 
     return ViewState["SortExpression"] == null ? string.Empty : ViewState["SortExpression"].ToString(); 
    } 
    set 
    { 
     ViewState["SortExpression"] = value; 
    } 
} 

private string SortDirection 
{ 
    get 
    { 
     return ViewState["SortDirection"] == null ? string.Empty : ViewState["SortDirection"].ToString(); 
    } 
    set 
    { 
     ViewState["SortDirection"] = value; 
    } 
} 

這是獲得方法接下來的排序方向:

private string GetSortDirection(string sortExpression) 
{ 
    if (sortExpression == this.SortExpression) 
    { 
     // reverse the sort direction when current sort expression is the same as the last time 
     if (this.SortDirection == "ASC") 
     { 
      return "DESC"; 
     } 
     else 
     { 
      return "ASC"; 
     } 
    } 
    else 
    { 
     // always return ASC when current sort expression is different than the last time 
     return "ASC"; 
    } 
} 
gvResults_Sorting

最後:

protected void gvResults_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    try 
    { 
     DataTable dtSortTable = gvResults.DataSource as DataTable; 

     if (dtSortTable != null) 
     { 
      // get sort direction (ASC or DESC) 
      string sortDirection = GetSortDirection(e.SortExpression); 

      DataView dvSortedView = new DataView(dtSortTable); 

      dvSortedView.Sort = e.SortExpression + " " + sortDirection; 

      gvResults.DataSource = dvSortedView; 
      gvResults.DataBind(); 

      // save current sort expression and sort direction to ViewState 
      this.SortExpression = e.SortExpression; 
      this.SortDirection = sortDirection; 
     } 
    } 
    catch (Exception ex) 
    { 
     ExceptionHandling.NETException(ex, constPageID, constIsSiteSpecific); 
    } 
} 
+0

好的,我添加了它,它在某種程度上起作用,但它只會在一個方向上排序一次,然後再次單擊它時它什麼也不做。 – connersz

+0

看到我編輯的答案。 – ekad

相關問題