2011-10-07 17 views
7

Mi SortedAscendingHeaderStyle y SortedDescendingHeaderStyle no funciona en absolutoASP.NET GridView SortedAscendingHeaderStyle no funciona

<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> 

filas se ordenan correctamente cuando se hace clic en los encabezados, pero cuando examino la cabecera usando FireBug, sólo muestra: (esto es cuando se ordena de forma ascendente)

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

ForeColor y CssClass no se configuran en absoluto.

¿Alguien tiene alguna idea de lo que estoy haciendo mal?

EDIT: Mi código C# detrás

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

Pregunta tonta, ¿qué sucede si haces una actualización dura Ctl + F5? –

+0

Firefox pregunta si deseo "Reenviar", hice clic en él, luego la columna sigue ordenada y el encabezado aún no tiene clase/estilo. – Aximili

Respuesta

13

No estoy seguro de si SortedDescendingHeaderStyle obras sin código si no se está usando un asp:SQLDataSource como origen de datos GridView. Pero una pequeña codificación puede llevarte allí.

Debe aplicar el estilo CSS manualmente a la celda del encabezado. Puedes hacerlo en el evento de Clasificación.

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

Gracias Jim. De hecho terminé usando DataTable (http://datatables.net/) – Aximili

+0

No funciona :-(Cuando llamo a gridview.DataBind(), el CSS desaparece de nuevo. – machj

0

creo que es el momento de su enlace de datos. Cambiar su enlace de datos para trabajar de esta manera:

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

¡Gracias, Rick! Pero todavía no funciona :( – Aximili

5

No tengo suficientes representantes para comentar sobre la respuesta aceptada. Cuando traté de aplicar la solución, se ordenó correctamente, pero no aplicó la clase CSS a lo que finalmente se procesó.

En mi caso, invocando DataBind() en mi cuadrícula DESPUÉS de ordenar mi DataSource (Lista) y asignándola como el DataSource de la grilla, pero ANTES de configurar la CssClass hizo el truco. Pensé que compartiría en caso de que alguien más encontrara algo similar.

+0

¿Quiere decir que en el controlador de eventos '_Sorting' llamó a' DataBind() 'y luego asignó' CssClass' a las propiedades del estilo asc/desc de clasificación? Estoy tratando de usar los estilos, pero no parecen para ser aplicado. – ajeh

+0

Su solución funciona. El proceso debe ser 1) asignar la fuente de datos ordenados a la red; 2) llamar a DataBind(); 3) Asignar clase ascendente/descendente a CssClass a la celda de fila de encabezado de la columna ordenada. Esta solución no está usando – ajeh

Cuestiones relacionadas