Pregunta

Quiero subclasificar el DropDownList integrado en ASP.NET para poder agregarle funcionalidad y usarlo en mis páginas. Intenté hacer esto con un UserControl pero descubrí que no expone el DropDownList interno (lógicamente, supongo). He buscado en Google la respuesta, pero no puedo encontrar nada.

He llegado al punto de escribir la clase real, y es posible crear una subclase de DropDownList pero no puedo registrar el archivo en mi página ASP.NET y usarlo en la vista de origen. Tal vez me estoy perdiendo algunas propiedades en mi clase?

¿Alguna idea?

¿Fue útil?

Solución

Desea extender DropDownList en un control personalizado ... no en un control de usuario.

Cree un nuevo proyecto de biblioteca de clases llamado MyLibrary.

Agregue una clase llamada MyDropDownList.cs

namespace My.Namespace.Controls
{
[ToolboxData("<{0}:MyDropDownList runat=\"server\"></{0}:MyDropDownList>")]
public class MyDropDownList: DropDownList
{
    // your custom code goes here
    // e.g.
    protected override void  RenderContents(HtmlTextWriter writer)
    {
        //Your own render code
    }
}
}

Una vez que compile su biblioteca, puede agregar una referencia a ella en su aplicación web.

Y un tagprefix en tu web.config

    <add tagPrefix="my" namespace="My.Namespace.Controls" assembly="MyLibrary" />

Eso debería permitirte agregar esto a tus aspx / ascx's

<my:MyDropDownList ID="myDDl" runat="server">
    ...
</my:MyDropDownList>

Otros consejos

En un comentario, aclaras tu objetivo: " Lo único que quiero hacer con él es agregar una propiedad InitialValue que defina el primer valor que siempre está presente en el DDL. "

No creo que necesites crear un control de usuario especial o un control personalizado para lograr eso.

A menudo utilizo este código en mis aplicaciones web para rellenar los controles de la lista. Pasas un booleano que indica si se agregará un ListItem adicional en la parte superior de la lista y el texto para ese elemento.

    public static void BindListControl (ListControl ctl, SqlDataReader dr,
        String textColumn, String valueColumn, bool addBlankRow, string blankRowText)
    {
        ctl.Items.Clear();
        ctl.DataSource = dr;
        ctl.DataTextField = textColumn;
        ctl.DataValueField = valueColumn;
        ctl.DataBind();

        if (addBlankRow == true) ctl.Items.Insert(0, blankRowText);
    }

Esto es útil, por ejemplo, si desea que cada DropDownList tenga como valor inicial un espacio en blanco, o un texto como " Seleccione una ciudad " ;.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top