2009-05-27 25 views
9

Estoy intentando añadir una clase CSS a una fila en RowDataBound. Estoy usando la propiedad alterna de la clase css contra GridView, así que supongo que esto se aplica a RowDataBound. Si asigna una clase CSS programáticamente a la propiedad CssClass de la fila dentro del evento RowDataBound, no se aplica la clase css de estilo de fila alternativa, , aunque agregue la clase CSS.Agregar clase CSS en RowDataBound

Esto es lo que tengo:

Protected Sub gvGeneral_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvGeneral.RowDataBound 
    If e.Row.RowType = DataControlRowType.DataRow Then 
     If previousExpenseType <> e.Row.Cells(2).Text And previousExpenseType.Length > 0 Then 
     e.Row.CssClass += "bottom-border" 
     End If 

     previousExpenseType = e.Row.Cells(2).Text 
    End If 
    End Sub 

previousExpenseType es sólo una cadena que estoy haciendo comparaciones contra. Si el tipo de gasto cambia, entonces quiero que se aplique un borde en la parte inferior del elemento <tr>.

¿Alguna idea de cómo evitar esto? Parece que hay un evento después de RowDataBound que aplica la clase css de estilo de fila alterna a la fila.

Respuesta

2

Otro trabajo que puede intentar es realizar sus comprobaciones y la manipulación de la clase CSS después de que todas las filas estén enlazadas a datos utilizando uno de los últimos eventos de gridview y recorriendo las filas usted mismo. Soy consciente de que esto agregaría un tiempo de procesamiento adicional, pero dependiendo del tamaño de los conjuntos de datos que muestre, podría valer la pena.

+0

Sí, eso es lo que esperaba no escuchar, pero parece ser la solución más viable en este momento. – Kezzer

+0

Entiendo. Definitivamente no es el ideal, pero si lo que dices es cierto acerca de un posible evento oculto que sobrescribe lo que estás haciendo, realmente no puedo pensar en muchas formas de eludir eso sin a) deshacerte de cualquier regla para el estilo del elemento y alternar estilo de fila (no deseado) o b) dando vueltas y haciendo lo que debe hacerse después del hecho. – TheTXI

-1

Gridview rowdatabound le permite SÓLO manipular el HTML dentro de un TR, por lo que probablemente no tenga la opción de hacer lo que quiera con gridView. En cambio, recomendaría usar Repeater, que le da mucho más control sobre el HTML que genera. esto es lo que puede hacer con el repetidor

<table> 
    <thead> 
     <tr><td>Head1</td><td>Head2</td></tr> 
    </thead> 
    <asp:Repeater ID="rptTaskItems" runat="server"> 
     <ItemTemplate> 
      <tr><td>column 1 data</td> 
       <td>column 1 data</td> 
      </tr> 
      <asp:PlaceHolder ID="PHBar" runat="server" visible="false"> 
      <tr><td colspan="2"><hr/></td> 
      </tr> 
      </asp:PlaceHolder> 
     </ItemTemplate> 
    </asp:Repeater> 
</table> 

En el ItemDataBound, puede hacer que este marcador de posición [PHBar] visible sólo cuando su condición es verdadera y eso es todo.

Espero que esto ayude.

+0

No estoy seguro de donde postura con esto es. La propiedad CssClass SI FUNCIONA, mi problema es que el evento oculto que ocurre después de RowDataBound no agrega la clase alterna de CSS. Estoy aplicando una clase CSS, por lo tanto, estoy manipulando el HTML. – Kezzer

+0

Parece un poco duro Kez;) – Chris

13

probar esto en el controlador de eventos RowDataBound ...

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    GridView grid = GridView1; 
    GridViewRow row = e.Row; 
    if (row.RowType == DataControlRowType.DataRow) 
    { 
     bool isAlternating = row.RowState == DataControlRowState.Alternate; 

     List<string> classes = new List<string>(); 

     /* Setting the CssClass of a row overwrites any CssClass declared in the 
     * markup, so lets save the value that is in the markup and add to it. 
     */ 
     if (isAlternating) { classes.Add(grid.AlternatingRowStyle.CssClass); } 
     else { classes.Add(grid.RowStyle.CssClass); } 

     // 
     //logic for adding other css classes to the row... 
     // 

     //set the CssClass property of the row to the combined css classes value 
     row.CssClass = string.Join(" ", classes.ToArray()); 

     // 
     //more row processing... 
     // 
    } 
} 
+0

Es posible que desee hacer 'row.RowState.HasFlag (DataControlRowState.Alternate)' en su lugar, ya que 'DataControlRowState' es un' Flags enum'. Probablemente el framework .net ha cambiado desde entonces, al menos se ha agregado el 'HasFlag' en VS2010/.net 4. – Andrew

Cuestiones relacionadas