2011-10-07 68 views
7

SortedAscendingHeaderStyleSortedDescendingHeaderStyle完全不ASP.NET的GridView SortedAscendingHeaderStyle不起作用

<asp:GridView ID="grdProducts" runat="server" CssClass="grid" AllowPaging="True" AllowSorting="True" PageSize="100" EmptyDataText="No data to show" 
       onrowdatabound="grdProducts_RowDataBound" onrowediting="grdProducts_RowEditing" onsorting="grdProducts_Sorting" AutoGenerateEditButton="True"> 
    <AlternatingRowStyle CssClass="even" /> 
    <SortedAscendingHeaderStyle ForeColor="White" CssClass="sorted" /> 
    <SortedDescendingHeaderStyle CssClass="sorted desc" /> 
</asp:GridView> 

行工作的正確排序被點擊頭時,但是當我檢查使用Firebug的頭,那隻能說明:(這是當按升序排序)

<th scope="col"> 
    <a href="javascript:__doPostBack('ctl00$body$ctl00$grdProducts','Sort$Namekey')">Namekey</a> 
</th> 

ForeColor和CssClass根本沒有設置。

任何人有任何想法我做錯了什麼?

編輯:背後

protected void grdProducts_Sorting(object sender, GridViewSortEventArgs e) 
    { 
    if ((string)ViewState["SortColumn"] == e.SortExpression) 
     ViewState["SortDirection"] = ((string)ViewState["SortDirection"] == "") ? " DESC" : ""; 
    else 
    { 
     ViewState["SortColumn"] = e.SortExpression; 
     ViewState["SortDirection"] = ""; 
    } 
    } 

    protected override void OnPreRender(EventArgs e) 
    { 
    BindGrid(); 
    base.OnPreRender(e); 
    } 

    private void BindGrid() 
    { 
    string query = "SELECT ... ORDER BY " + ViewState["SortColumn"] + ViewState["SortDirection"]; 

    DataTable dt = SqlFunctions.Select(query); 
    grdProducts.DataSource = dt; 
    grdProducts.DataBind(); 
    } 
+0

愚蠢的問題,如果你做一個硬刷新Ctl + F5會發生什麼? –

+0

Firefox詢問我是否想要「重新發送」,我點擊它,然後列仍然排序,並且標題仍然沒有類/樣式。 – Aximili

回答

13

我不知道,如果你不使用asp:SQLDataSource作爲你的GridView的數據源SortedDescendingHeaderStyle作品沒有代碼。但有一點編碼可以讓你在那裏。

您需要手動將CSS樣式應用於標題單元格。您可以在排序事件中執行此操作。

protected void grdProducts_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    if ((string)ViewState["SortColumn"] == e.SortExpression) 
    { 
     ViewState["SortDirection"] = ((string)ViewState["SortDirection"] == "") ? " DESC" : ""; 
     grdProducts.HeaderRow.Cells[GetColumnIndex(e.SortExpression)].CssClass = "AscendingHeaderStyle"; 
    } 
    else 
    { 
     ViewState["SortColumn"] = e.SortExpression; 
     ViewState["SortDirection"] = ""; 
     grdProducts.HeaderRow.Cells[GetColumnIndex(e.SortExpression)].CssClass = "DescendingHeaderStyle"; 
    } 
    BindGrid(); 
} 




private int GetColumnIndex(string SortExpression) 
{ 
    int i = 0; 
    foreach(DataControlField c in gvwCustomers.Columns) 
    { 
     if(c.SortExpression == SortExpression) 
      break; 
     i++; 
    } 
    return i; 
} 
+0

謝謝吉姆。我實際上結束了使用DataTable(http://datatables.net/) – Aximili

+0

它不起作用:-(當我調用gridview.DataBind()時,CSS消失 – machj

0

我的C#代碼,我覺得這是你綁定的時機。更改綁定像這樣的工作:

protected void Page_Load(object sender, EventArgs e) 
    {  
    if (!Page.IsPostBack) 
    { 
     BindGrid();  
    } 
    } 

    protected void grdProducts_Sorting(object sender, GridViewSortEventArgs e) 
    { 
    if ((string)ViewState["SortColumn"] == e.SortExpression) 
     ViewState["SortDirection"] = ((string)ViewState["SortDirection"] == "") ? " DESC" : ""; 
    else 
    { 
     ViewState["SortColumn"] = e.SortExpression; 
     ViewState["SortDirection"] = ""; 
    } 
    BindGrid(); 
    } 

GridView.Sorting Event

+0

謝謝瑞克!但它仍然不起作用:( – Aximili

5

我沒有足夠的代表評論接受的答案。當我嘗試應用該解決方案時,它會正確排序,但並未將CSS類應用於最終呈現的內容。

在我的情況下,調用我的網格後排序我的DataSource(List)並將其分配爲網格的DataSource,但在設置CssClass之前調用DataBind()做了竅門。如果有人遇到類似的情況,我會分享。

+0

你是否在'_Sorting'事件處理程序中調用'DataBind()',然後將'CssClass'分配給排序的asc/desc樣式屬性?我試圖使用這些樣式,但它們看起來並不像 – ajeh

+0

你的解決方案的工作過程應該是1)將排序的數據源分配給網格; 2)調用DataBind(); 3)將CssClass的升序/降序類分配給排序列的標題行單元格。此解決方案未使用 – ajeh