Pergunta

Eu quero subclasse o built-in DropDownList em ASP.NET para que eu possa adicionar funcionalidade a ele e usá-lo em minhas páginas. Eu tentei fazer isso com um UserControl mas descobriu que não exponha o DropDownList interna (logicamente, eu acho). Eu pesquisei para a resposta, mas não consigo encontrar nada.

Eu tenho chegado tão longe como escrever a classe real, e é possível subclasse de DropDownList, mas eu sou incapaz de registrar o arquivo em minha página ASP.NET e usá-lo na exibição da fonte. Talvez eu estou faltando algumas propriedades na minha classe?

Todas as idéias?

Foi útil?

Solução

Você deseja estender DropDownList em um controle personalizado ... não em um usercontrol.

Criar um novo projeto Class Library chamado MyLibrary.

Adicione uma classe chamada 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
    }
}
}

Uma vez que você compilar sua biblioteca, você pode adicionar uma referência a ele em sua aplicação web.

E um tagprefix em seu web.config

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

Isso deve permitir que você adicione isso ao seu aspx / ascx de

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

Outras dicas

Em um comentário, você esclarecer seu objetivo: "A única coisa que eu quero fazer com ele é adicionar uma propriedade InitialValue que define o primeiro valor que está sempre presente na DDL"

Eu não acho que você precisa para criar um controle especial usuário ou controle personalizado para conseguir isso.

Costumo usar este código ao longo dos meus aplicativos web para preencher controles de lista. Você passa um booleano que indica se um ListItem adicional deve ser adicionado no topo da lista, eo texto para esse item.

    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);
    }

Isto é útil, por exemplo, se você quiser todos os DropDownList para ter como seu valor inicial um espaço em branco ou texto como "Escolha uma cidade".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top