2012-09-21 102 views
0

我有一個正在填充好的gridview。現在我想啓用排序。我已經完成了所有必需的代碼 - 即對標記進行排序並在用戶排序時提供要調用的事件。asp.net gridview排序自定義數據源

它的排序事件,我失去了 - 我已經嘗試了谷歌的一些實現,但我不太確定。基本上我是說,我需要提供新的查詢回服務器取決於用戶想要排序的列和ASC或DESC也corect?如果是這樣,聽起來像更多的工作....更多的疑問。

感謝 DAMO

代碼背後綁定的網格

// Load the main homepage data to the grid 
        FAServices fServices = new FAServices(sConn); 
        FAAuditOverallStatusLatest fAuditOverallStatusLatest = new FAAuditOverallStatusLatest(sConn); 
        GridViewMain.DataSource = fAuditOverallStatusLatest.getAuditOverallStatusLatest(); 
        GridViewMain.DataBind(); 

後面的代碼進行排序

protected void GridViewMain_Sorting(object sender, GridViewSortEventArgs e) 
{ 

    // Switch statements required here along with Query for each column i have in the grid 




} 

電網標記

<asp:GridView ID="GridViewMain" OnRowDataBound="GridViewMainRowDataBound" OnPageIndexChanging="GridViewMain_PageIndexChanging" 
             runat="server" AllowPaging="True" PageSize="50" PagerSettings-Position="TopAndBottom" 
             CssClass="mGrid" 
             PagerStyle-CssClass="pgr" 
             AlternatingRowStyle-CssClass="alt data-row" 
             OnRowCreated="GridViewMain_RowCreated"       
             RowStyle-CssClass="data-row"           
             AllowSorting="True" 
             OnSorting="GridViewMain_Sorting" 
             > 
            </asp:GridView> 
+0

你是正確的查詢需要處理排序方向。您還需要決定在視圖狀態,網址或會話中存儲當前排序方向的位置。 –

回答

1

我在說,我需要提供新的查詢回 服務器根據用戶想要什麼樣的列進行排序和ASC或DESC 也corect?如果是這樣,聽起來像更多的工作....更多的疑問。

是的,你是對的。您需要再次查詢您的數據源以應用新的排序。但最後一句話是不正確的。你只需要改變你的sql的ORDER BY(或者你用來訂購DataSource的任何東西)。你可以使用一個ViewState變量作爲順序列和方向(你需要在回傳中保留它,因此是ViewState)。我會給你舉個例子:

首先,你需要設置SortExpression

<asp:TemplateField HeaderText="Name" SortExpression="Name"> 
    <ItemTemplate> 
     <a href='sometest.aspx?ID=<%# DataBinder.Eval(Container.DataItem, "TestID").ToString()%>'><%# DataBinder.Eval(Container.DataItem, "Type").ToString()%></a> 
    </ItemTemplate> 
</asp:TemplateField>  
<asp:TemplateField HeaderText="Address" SortExpression="Address"> 
    <ItemTemplate> 
       <div align="right"><%# (DataBinder.Eval(Container.DataItem, "HouseNumber"))%></div> 
    </ItemTemplate> 
</asp:TemplateField>    

在代碼隱藏,你可以存儲當前SortExpressionViewStateSortDirection

private string SortExpression { 
    get { 
     if(String.IsNullOrWhiteSpace((String)ViewState["SortExpression"]) 
      ViewState["SortExpression"] = "Name ASC"; 

     return (String)ViewState["SortExpression"]; 
    } 
    set { ViewState["SortExpression"] = value; } 
} 

這裏的Sorting事件處理程序。需要注意的是BindGrid是方法你設置DataSource並調用GridView.DataBind

protected void theGrid_Sorting(object sender, System.Web.UI.WebControls.GridViewSortEventArgs e) 
{ 
    string currentSortColumn = null; 
    string currentSortDirection = null; 
    currentSortColumn = this.SortExpression.Split(' ')[0]; 
    currentSortDirection = this.SortExpression.Split(' ')[1]; 

    if (e.SortExpression.Equals(currentSortColumn)) { 
     //switch sort direction 
     switch (currentSortDirection.ToUpper()) { 
      case "ASC": 
       this.SortExpression = currentSortColumn + " DESC"; 
       break; 
      case "DESC": 
       this.SortExpression = currentSortColumn + " ASC"; 
       break; 
     } 
    } else { 
     this.SortExpression = e.SortExpression + " ASC"; 
    } 

    //load the data with this SortExpression and DataBind the Grid 
    BindGrid(); 
} 
+0

嗨,在你的代碼結束時,你會說「//用這個SortExpression和DataBind加載數據網格」。你的意思是「//用這個SortExpression和currentSortColumn和DataBind加載數據Grid」 – user1438082

+0

@ user1438082:不,你可以看到'SortExpression'包含'currentSortColumn' +'SortDirection'。這意味着你只需要將SortExpression附加到你的sql的'ORDER BY'結尾。這種方法支持在兩個方向上進行排序,如果用戶在同一列上連續點擊,則SortDirection對該列進行更改。請注意,屬性'SorteExpression'具有默認排序,因此相應地更改它。 –

+0

非常感謝你! – user1438082

1

我有幾行更爲簡單的方法:(代碼vb.net,在C#中的翻譯很容易)

Dim SortDirection As String, SortExpression As String 
SortExpression = e.SortExpression 
If (SortExpression = ViewState("SortExpression") And ViewState("SortDirection") = "asc") Then 
    SortDirection = "desc" 
Else 
    SortDirection = "asc" 
End If 
ViewState("SortDirection") = SortDirection 
ViewState("SortExpression") = SortExpression 

Dim dt As Data.DataTable = ds.Tables(0) '<<<< fill ds with a method 
dt.DefaultView.Sort = SortExpression & " " & SortDirection 

GridView1.DataSource = dt.DefaultView 
GridView1.DataBind() 

就是這樣。它很容易然後將此代碼放在一個泛型類,適用於其他GridView的

+0

我發現它更容易使用telerik或devexpress gridview控件。它們內置的功能可以爲您節省數週時間 – user1438082