Eu estou criando um controle composto para um DropDownList (que também inclui um rótulo).
A ideia é que eu posso usar o meu controle como uma lista suspensa, mas também ter um rótulo na página em frente ao DDL.
Eu tenho isso funcionando perfeitamente para TextBoxes, mas estou lutando com o DDL por causa do componente Collection (ou Datasource) para preencher o DDL.
Basicamente eu quero ser capaz de fazer algo assim:
<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>
O problema é que eu não estou estendendoDropDownList classe para o meu controle, então eu não posso simplesmente trabalhar com essa mágica. Eu preciso de algumas dicas para descobrir como eu posso transformar meu controle (MyDropDownList), que atualmente é apenas um System.Web.UI.UserControl
, em algo que aceita itens de lista dentro da tag e, idealmente, eu gostaria de poder conectá-lo a uma fonte de dados (as mesmas funções que a DDL normal oferece).
Eu tentei sem sorte apenas estendendo o DDL regular, mas não consegui o Label
componente para voar com ele.
Respostas:
1 para resposta № 1Depois de cavar e procurar, encontrei uma solução que funciona. Espero que isso ajude alguém no 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;
}
}
0 para resposta № 2
A coisa mais fácil seria voltar para o seuopção original de estender o controle DropDownList. Quais problemas você teve para conseguir que o rótulo funcionasse? Esses problemas são provavelmente mais fáceis de resolver?