Domanda

Voglio sottoclassare il DropDownList integrato in ASP.NET in modo da poter aggiungere funzionalità e usarlo nelle mie pagine. Ho provato a farlo con un UserControl ma ho scoperto che non espone il DropDownList interno (logicamente, immagino). Ho cercato su Google la risposta ma non riesco a trovare nulla.

Sono arrivato al punto di scrivere la classe attuale ed è possibile effettuare la sottoclasse da DropDownList ma non riesco a registrare il file nella mia pagina ASP.NET e utilizzarlo nella vista di origine. Forse mi mancano alcune proprietà nella mia classe?

Qualche idea?

È stato utile?

Soluzione

Desideri estendere DropDownList in un controllo personalizzato ... non in un controllo utente.

Crea un nuovo progetto Libreria di classi chiamato MyLibrary.

Aggiungi una classe chiamata 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
    }
}
}

Dopo aver compilato la tua libreria, puoi aggiungere un riferimento ad essa nella tua applicazione web.

E un tagprefix nel tuo web.config

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

Ciò dovrebbe permetterti di aggiungere questo al tuo aspx / ascx's

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

Altri suggerimenti

In un commento, chiarisci il tuo obiettivo: " L'unica cosa che voglio fare è aggiungere una proprietà InitialValue che definisce il primo valore che è sempre presente nel DDL. "

Non credo sia necessario creare un controllo utente speciale o un controllo personalizzato per farlo.

Uso spesso questo codice in tutte le mie app Web per popolare i controlli dell'elenco. Si passa a un valore booleano che indica se aggiungere un ulteriore ListItem in cima all'elenco e il testo per quell'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);
    }

Ciò è utile, ad esempio, se vuoi che ogni elenco a discesa abbia uno spazio vuoto come valore iniziale o un testo come " Seleziona una città " ;.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top