Agregar una propiedad en un control de usuario con C# y Atributos

En estos días he tenido la necesidad de hacer un control de usuario personalizado, de forma que se pudiera reutilizar en dos formatos distintos. Concretamente se trataba de un control que mostraba las etiquetas de un blog y que podía presentarse de dos formas distintas:
· en formato lista (tag list)
· en formato nube (o cloud tags)

Dado que los controles se cargan en la página mediante el uso de <%@ Register %>, quería que tuviese un parámetro opcional con valores personalizados (y uno por defecto) y que estuviese accesible, mostrando todos los valores posibles, desde la vista de diseño.

Evidentemente esto se puede realizar de muchas formas, pero quería utilizar los atributos existentes en .NET, por lo que el siguiente desarrollo está encaminado hacia ese uso.

GENERACIÓN DEL CÓDIGO

Lo primero que debemos crear es una enumeración con los valores que necesitamos controlar con posterioridad. Dado que en este caso, lo que queremos controlar es el tipo de "display" que vamos a ejecutar al cargar el control, vamos a generar una enumeración auxiliar llamada DisplayOption. Así, obtendríamos el siguiente fragmento de código:

public enum
DisplayOption
{
    ToList,
    ToCloud
}


Una vez generada nuestra enumeración, debemos crear una propiedad pública en nuestro control. De esta forma, el sistema identificará dicha propiedad con el valor que le asignemos y desde ese momento, podrá trabajar con él.

public
DisplayOption Display { get; set; }


Aunque el sistema podría reconocer directamente la propiedad pública, es bueno y recomendable hacer uso de los atributos, desde donde podremos indicarle si es accesible, a qué categoría pertenece, el valor por defecto y una breve descripción. Según esto, el código resultante sería:

[
Browsable(true),
Category("Appearance"),
DefaultValue(DisplayOption.ToList),
Description("Indica el tipo de desplegado usado para la visualización.")]
public DisplayOption Display { getset; }


NOTA: Se debe utilizar la librería "using System.ComponentModel;" para que el sistema reconozca los atributos utilizados.


Ya sólo nos queda modificar el código fuente del control para formatear la información según el valor que tenga la propiedad. Esto se podría hacer en la carga del control de forma:

protected void Page_Load(object sender, EventArgs e)
{
    if (Display == DisplayOption.ToList)
        GeneraListaDeEtiquetas();
    else
        GeneraNubeDeEtiquetas();
}


Una vez realizado este punto, ya podríamos acceder a dicha propiedad desde el diseñador, y además tendríamos listados en ella todos los elementos. Aunque no incluyesemos dicha propiedad en el diseñador, ya tendría un valor asignado por el atributo.


Así, tendríamos en la página contenedora el siguiente fragmento de código disponible:


<%@ Register TagPrefix="ctrl" TagName="NavTags" Src="~/controls/NavTagControl.ascx" %>

<ctrl:NavTags runat="server" ID="NavTagControl" Display="ToCloud"  />

Aquí podéis ver una captura del efecto final.





Enlaces de referencia:
User Controls Custom Properties
Walkthrough: Developing and Using a Custom Server Control

4 comentarios:

  1. Como siempre tan didáctico. Deberías dedicarte a esto full-time, creo que es lo tuyo :)

    ResponderEliminar
  2. gracias me sirvió ami también :)

    Atte. Nicolás Hörmann Manriquez

    ResponderEliminar
  3. Muchas Gracias por tu aporte. Me aclaraste muchas dudas.

    ResponderEliminar