How to Keep colors on gridview after Postback? asp.net c#

asp.net, c#, gridview, postback

Solution

You need to set your colors on the event of `onprerender` and not on RowDataBound, so set the event on GridView

onprerender="gvMyLista_PreRender"

and on code behind

protected void gvMyLista_PreRender(object sender, EventArgs e)
{
   // loop your data, and fix your colors.
   for (int i = 0; i < gvMyLista.Rows.Count; i++)
   {
       // get your data as...
      // gvMyLista.Rows[i].Cells[2].Text
   }
}

Problem

I have a gridview which I change some of the rows colors after using RowDataBound.... Here's my gridview ``` <asp:GridView ID="grdvEventosVendedor" runat="server" AllowPaging="True" AutoGenerateColumns="False" CellPadding="4" DatakeyNames="idCita" EmptyDataText="No Hay Eventos Para Este Vendedor" ForeColor="#333333" GridLines="None" AllowSorting="True" onpageindexchanging="grdvEventosVendedor_PageIndexChanging" onrowcommand="grdvEventosVendedor_RowCommand" onsorting="grdvEventosVendedor_Sorting" CellSpacing="1" onrowdatabound="grdvEventosVendedor_RowDataBound" > <AlternatingRowStyle BackColor="White" ForeColor="#284775"/> <Columns> <asp:TemplateField HeaderText="" ItemStyle-Width="35px"> <ItemTemplate> <asp:ImageButton ID="imgBtnEdicEvento" runat="server" CommandArgument='<%# Eval("idCita")%>' CommandName="Edicion" Height="32px" ImageUrl="~/img/pencil_32.png" Width="32px" /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="" ItemStyle-Width="35px"> <ItemTemplate> <asp:ImageButton ID="imgBtnDelete" runat="server" CommandName="Borrar" ImageUrl="~/img/1385_Disable_16x16_72.png" onclientclick="return confirm('¿Desea eliminar el registro?');" CommandArgument='<%# Eval("idCita")%>' /> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="Cliente" HeaderText="Cliente" InsertVisible="False" ReadOnly="True" SortExpression="Cliente" ItemStyle-Width="50px" /> <asp:BoundField DataField="Empresa" HeaderText="Empresa" InsertVisible="False" ReadOnly="True" SortExpression="Empresa" ItemStyle-Width="50px"/> <asp:BoundField DataField="Telefono" HeaderText="Telefono" InsertVisible="False" ReadOnly="True" SortExpression="Telefono" ItemStyle-Width="50px"/> <asp:BoundField DataField="Nextel" HeaderText="Nextel" InsertVisible="False" ReadOnly="True" SortExpression="Nextel" ItemStyle-Width="50px"/> <asp:BoundField DataField="Tipo" HeaderText="Tipo" InsertVisible="False" ReadOnly="True" SortExpression="Tipo" ItemStyle-Width="50px"/> <asp:BoundField DataField="Descripcion" HeaderText="Descripcion" InsertVisible="False" ReadOnly="True" SortExpression="Descripcion" ItemStyle-Width="150px"/> <asp:TemplateField HeaderText="Fecha" SortExpression="Fecha" ItemStyle-Width="50px"> <ItemTemplate> <asp:Label ID="lblFecha" runat="server" Text='<%#Bind("Fecha", "{0:dd/MM/yyyy}")%>'> </asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="tbxFecha" runat="server" Text='<%#Bind("Fecha","{0:dd/MM/yyyy}") %>' ValidationGroup="gpEdicionAgenda"> </asp:TextBox> </EditItemTemplate> </asp:TemplateField> <asp:BoundField DataField="HoraInicio" HeaderText="Hora" InsertVisible="False" ReadOnly="True" SortExpression="HoraInicio" ItemStyle-Width="50px"/> <asp:BoundField DataField="Lugar" HeaderText="Lugar" InsertVisible="False" ReadOnly="True" SortExpression="Lugar" ItemStyle-Width="50px"/> <asp:BoundField DataField="Estado" HeaderText="Estado" InsertVisible="False" ReadOnly="True" SortExpression="Estado" ItemStyle-Width="50px"/> <%--<asp:TemplateField HeaderText="Estado" ItemStyle-Width="50px"> <ItemTemplate> <asp:DropDownList ID="dpdListEstado" runat="server" OnSelectedIndexChanged="dpdListEstado_SelectedIndexChanged" AutoPostBack="True" CommandArgument=""> <asp:ListItem>Pendiente</asp:ListItem> <asp:ListItem>Atendido</asp:ListItem> </asp:DropDownList> </ItemTemplate> </asp:TemplateField>--%> <asp:TemplateField HeaderText="Atender" ItemStyle-Width="35px"> <ItemTemplate> <asp:ImageButton ID="imgBtnAtender" runat="server" CommandArgument='<%# Eval("idCita")%>' CommandName="Atender" ImageUrl="~/img/activar.png" Width="16px" Height="16px" onclientclick="return confirm('¿Desea marcar como atendido este registro?');" /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="CRM" ItemStyle-Width="35px"> <ItemTemplate> <asp:ImageButton ID="imgBtnCRM" runat="server" CommandArgument='<%# Eval("IdCliente")%>' CommandName="CRM" ImageUrl="~/img/go.gif" Width="16px" Height="16px" /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="VM" ItemStyle-Width="35px"> <ItemTemplate> <asp:ImageButton ID="imgBtnVerMas" runat="server" CommandArgument='<%# Eval("IdCliente")%>' CommandName="VerMas" ImageUrl="~/img/search.png" Width="16px" Height="16px" /> </ItemTemplate> </asp:TemplateField> </Columns> <EditRowStyle BackColor="#999999" Font-Size="Small" /> <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" Font-Size="Larger" /> <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> <RowStyle BackColor="#F7F6F3" ForeColor="#333333" HorizontalAlign="Center" Font-Size="Small" /> <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> <SortedAscendingCellStyle BackColor="#E9E7E2" /> <SortedAscendingHeaderStyle BackColor="#506C8C" /> <SortedDescendingCellStyle BackColor="#FFFDF8" /> <SortedDescendingHeaderStyle BackColor="#6F8DAE" /> </asp:GridView> ``` in my cs I have... ``` private static string strColorUrgente = "#FF525D"; private static string strColorEnCurso = "#FFDE00"; private static string strColorHoy = "#3ECF00"; ``` and here's the rowbounddata function ``` protected void grdvEventosVendedor_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowIndex >= 0 && e.Row.Cells[11].Text == "Pendiente") { string strFecha = (e.Row.FindControl("lblFecha") as Label).Text; int intYear = Convert.ToInt32(strFecha.Split('/')[2]); int intMonth = Convert.ToInt32(strFecha.Split('/')[1]); int intDay = Convert.ToInt32(strFecha.Split('/')[0]); DateTime dtmFecha = new DateTime(intYear, intMonth, intDay); if (dtmFecha < DateTime.Today) { e.Row.BackColor = Color.FromName(strColorUrgente); } else if (dtmFecha == DateTime.Today) { DateTime dtmHoraInicio = Convert.ToDateTime(e.Row.Cells[9].Text); if (dtmHoraInicio > DateTime.Now) { e.Row.BackColor = Color.FromName(strColorHoy); } else { e.Row.BackColor = Color.FromName(strColorEnCurso); } } } } ``` Whenever I enter to this page or I use a search engine, I refresh the gridview with a datasource, and of course, the RowDataBound is triggered... and eventually some of the rows' colors will be changed... You'll notice that in the gridview, on the last column there's a button called imgBtnVerMas... When pressed, it triggers the following function ``` string strMensaje = ""; try { //Method that brings back data from a specific client (returns a datatable) //intIdCliente was defined in the CommandArgument DataTable dtDatosCliente = ConexionBD.GetInstanciaConexionBD().GetClienteEspecifico2(intIdCliente); //Assigning to a string a message that needs info from the previous datatable strMensaje += "DATOS DEL CLIENTE\\n\\nNombre:\\t" + dtDatosCliente.Rows[0]["Cliente"] + "\\nEmpresa: " + dtDatosCliente.Rows[0]["Empresa"]; } catch { if (strMensaje == "") { strMensaje = "Hubo Un Error Al Traer Los Datos Del Cliente"; } else { strMensaje += "\n\nERROR!!!!!!!"; } } ClientScript.RegisterStartupScript(this.GetType(), "Mensaje", "alert('" + strMensaje + "');", true); ``` Afterwards, the message is displayed, however, all of the rows colors dissapear... I was wondering... how can I keep the colors of the gridview's rows even after a postback... Thanks

Original source