Aggiungere capacità di fornire elementi di una lista di controllo composito con DropDownList
-
03-10-2019 - |
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.
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?