Hoy llegué al trabajo y me encontré con que tenía que hacer una página que mostrara información tabular. El problema por así decirlo era que el texto que se iba a mostrar en una columna tenía que tener un color de fuente dependiendo de la información. Por ejemplo, si el texto era "Satisfactorio", entonces el color del texto tenía que ser verde. Si el texto era "Error", entonces el color del texto tenía que ser rojo.
El sitio Web en el cual tenía que poner la página tenía una carpeta ASP.NET de temas (App_Themes) con un tema (Theme1). Lo primero que vamos a hacer es definir en un archivo skin (SkinFile.skin) lo siguiente:
<asp:Label ID="Label1" SkinID="LabelRojo" runat="server" Font-Names="Arial" Font-Size="11px"
ForeColor="Red" />
<asp:Label ID="Label2" SkinID="LabelVerde" runat="server" Font-Names="Arial" Font-Size="11px"
ForeColor="Green" />
La propiedad StylesheetTheme de la página la establecemos en "Theme1".
Para esta prueba vamos a crear una clase llamada "Demostracion" de la siguiente manera:
public class Demostracion
{
private string _Estado;
public string Estado
{
get { return _Estado; }
set { _Estado = value; }
}
public Demostracion(string pEstado)
{
Estado = pEstado;
}
}
En el code-behind de la página ponemos lo siguiente:
protected object ObtenerSpanEstado(string pEstado)
{
string lSpanEstado = string.Empty;
Label lLabelEstado = new Label();
lLabelEstado.Text = pEstado;
if (pEstado == "Satisfactorio")
{
lLabelEstado.SkinID = "LabelVerde";
}
else if (pEstado == "Error")
{
lLabelEstado.SkinID = "LabelRojo";
}
lLabelEstado.ApplyStyleSheetSkin(this.Page);
StringWriter lHTMLRenderizado = new StringWriter();
HtmlTextWriter lHtmlTextWriter = new HtmlTextWriter(lHTMLRenderizado);
lLabelEstado.RenderControl(lHtmlTextWriter);
return lHTMLRenderizado.ToString();
}
Y en el GridView creamos una columna de tipo TemplateField. De HeaderText le ponemos algo como "Estado". La propiedad AutoGenerateColumns del GridView la establecemos en False. En el código de marcas de la página, dentro del elemento asp:TemplateField (que fue la columna que creamos), ponemos lo siguiente:
<ItemTemplate>
<%# ObtenerSpanEstado((string)Eval("Estado")) %>
</ItemTemplate>
Y para ir terminando, vamos a poblar el GridView en el Page_Load:
protected void Page_Load(object sender, EventArgs e)
{
List<Demostracion> lDemostraciones = new List<Demostracion>();
lDemostraciones.Add(new Demostracion("Satisfactorio"));
lDemostraciones.Add(new Demostracion("Error"));
lDemostraciones.Add(new Demostracion("Satisfactorio"));
lDemostraciones.Add(new Demostracion("Error"));
lDemostraciones.Add(new Demostracion("Satisfactorio"));
this.GridView1.DataSource = lDemostraciones;
this.GridView1.DataBind();
}
Lo importante aquí es ObtenerSpanEstado. Cuando el GridView se encuentra atando la información, al nosotros haber definido en la plantilla que permite mostrar un elemento en un control enlazado a datos lo siguiente:
<%# ObtenerSpanEstado((string)Eval("Estado")) %>
Se va a llamar a ObtenerSpanEstado que va a recibir como parámetro el valor de la propiedad "Estado" del objeto de tipo "Demostracion" que el GridView se encuentre atando en ese momento (mediante reflexión hecha por el método Eval). Eval lo que hace es "Proporciona compatibilidad para analizar y evaluar una expresión de enlace de datos con respecto a un objeto en tiempo de ejecución". ObtenerSpanEstado devuelve el HTML que se va a insertar. Después a lLabelEstado le asignamos el ID de la máscara y llamamos a ApplyStyleSheetSkin que "Aplica al control las propiedades de estilo definidas en la hoja de estilos de página". Tenemos que llamar a ApplyStyleSheetSkin ya que el control Label lo creamos de manera programática. Finalmente RenderControl "Representa el control HtmlForm en el objeto HtmlTextWriter especificado" que al estar el HtmlTextWriter "enlazado" al StringWriter, nos va a permitir obtener la cadena HTML del Label.