viernes, enero 21, 2011

Cómo establecer/cambiar en tiempo de ejecución el valor de cualquier propiedad (Texto, Color, Icono...) de una celda de un GridView de ASP.Net

A continuación un ejemplo de un grid con 2 columnas configuradas para que:
1ª) Muestre un texto y un color dependiendo del valor de un campo numérico.
2ª) Muestre una imagen en función del valor de 2 campos. 

[MiPagina.aspx (Diseño de página)] 


<asp:GridView ID="grdIncidents" runat="server" CellPadding="4" ForeColor="#333333"
    GridLines="None" AutoGenerateColumns="False" DataKeyNames="ID" AllowPaging="False"
    AllowSorting="True" Width="100%" CssClass="GridViewStyle">
    <Columns>
        <asp:TemplateField HeaderText="Estado" HeaderStyle-HorizontalAlign="Left">
            <ItemTemplate>
                <asp:Label ID="gridViewLabelState" DataField="State" runat="server" 
                    ForeColor='<%# GetStateColor(Eval("State"))%>' 
                    Text='<%# IncidentStateToString(Eval("State"))%>'/>
            ItemTemplate>
        asp:TemplateField>
        <asp:TemplateField HeaderText="" HeaderStyle-HorizontalAlign="Left">
            <ItemTemplate>
                <asp:Image ID="gridViewImageSemaforo" runat="server" 
                    ImageUrl='<%# GetSemaphoreImageUrl(Eval("State"), Eval("CreationDate"))%>' />
            ItemTemplate>
        asp:TemplateField>
    Columns>
asp:GridView>


[MiPagina.aspx.cs (Code behind)]

/// Método llamado desde la pantalla para convertir la columna State a texto.
protected string IncidentStateToString(object state)
{
    return Incident.IncidentStateEnumToString((Incident.StateEnum)state);
}

/// Método llamado desde la página para cambiar el color de un State.
protected System.Drawing.Color GetStateColor(object state)
{
    return IncidentStateColor.GetStateColor((Incident.StateEnum)state);
}

/// Método llamado desde la página para establecer el semáforo a partir del estado y
/// la fecha de creación.
/// Si la incidencia está esperando por un Técnico y lleva abierta más de 1 semana => Rojo!
/// Si la incidencia está esperando por un Técnico pero NO lleva abierta más de 1 semana => Ámbar
/// En cualquier otro caso (la incidencia no está esperando por un Técnico)
/// Estado de la incidencia
/// Fecha de creación de la incidencia
/// String de la url de la imagen del semáforo que toque.
protected string GetSemaphoreImageUrl(object state, object creationDate)
{
    // Si la incidencia está esperando por un Técnico...
    if (Incident.GetStatesFromStatus(Incident.StatusEnum.WaitingForTechnic).Contains<int>((int)state))
        //...y abierta desde hace más de 1 semana => Rojo!
        if (DateTime.Compare( ((DateTime)creationDate).AddDays(7), DateTime.Now)>0)
            return "Resources/semaphoreRed.png";
        //...y abierta desde hace menos de 1 semana => Ámbar
        else
            return "Resources/semaphoreYellow.png";

    // En caso contrario (la incidencia no está esperando por un Técnico)
    else
        return "Resources/semaphoreGreen.png";
}

No hay comentarios:

Publicar un comentario