Domanda

Sto creando un controllo composito per una DropDownList (che include anche un Label).

L'idea è che posso utilizzare il mio controllo, come un elenco a discesa, ma anche avere un lancio Label nella pagina di fronte al DDL.

Ho questo perfettamente funzionante per TextBoxes, ma sto lottando con il DDL per la raccolta (o Origine dati), componente per popolare il DDL.

Fondamentalmente io voglio essere in grado di fare qualcosa di simile a questo:

<ecc:MyDropDownList ID="AnimalType" runat="server" LabelText="this is what will be in the label">
<asp:ListItem Text="dog" Value="dog" />
<asp:ListItem Text="cat" Value="cat" />
</ecc:MyDropDownList>

Il problema è che io non sto estendendo la classe DropDownList per il mio controllo, quindi non posso semplicemente lavorare con quella magia. Ho bisogno di alcune indicazioni per capire come posso trasformare il mio controllo (MyDropDownList), che è attualmente solo un System.Web.UI.UserControl, in qualcosa che accetterà Elenco articoli all'interno del tag e, idealmente, mi piacerebbe essere in grado di collegarlo a un DataSource (le stesse funzioni che le regolari offerte DDL).

Ho provato senza fortuna solo l'estensione del normale DDL, ma non ha potuto ottenere la componente Label di volare con esso.

È stato utile?

Soluzione

Dopo aver fatto qualche scavo e ricerca ho trovato una soluzione che funziona. Speriamo che questo contribuirà a qualcun altro in futuro:

[ParseChildren(true, "Items")]
public class EDropDownList : CompositeControl, IValidatedFields
{
    public string PromptingText { get; set; }
    public string Value { get; set; }
    public Label __Label { get; set; }
    private ListItemCollection _items;
    public DropDownList __DropDownList;
    public ListItemCollection Items 
    {
        get { return _items; }
        set
        {
            if (_items != value)
            {
                _items = value;
            }
        }
    }

    public string Type { get { return "DropDownList"; } }


    public EDropDownList()
    {
        __Label = new Label();
    }
    protected override void CreateChildControls()
    {
        __DropDownList = new DropDownList();
        foreach (ListItem myItem in _items)
        {
            __DropDownList.Items.Add(myItem);
        }
        Controls.AddAt(0, __Label);
        Controls.AddAt(1, __DropDownList);
    }

    protected override void OnLoad(EventArgs e)
    {
        // label section            
        __Label.Text = PromptingText+"<br />";
        __Label.ForeColor = Color.Red;
        __Label.Visible = false;
        // ddl section
        if (Page.IsPostBack)
            Value = __DropDownList.SelectedValue;
    }
}

Altri suggerimenti

La cosa più semplice sarebbe quella di andare di nuovo al vostro opzione originale di estendere il controllo DropDownList. Quali problemi hai avuto sempre l'etichetta per il lavoro con esso? Questi problemi sono probabilmente più facile da risolvere?

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