添加使用DropDownLIst为复合控件提供列表项的功能

时间:2010-05-07 04:20:37

标签: asp.net drop-down-menu composite-controls

我正在为DropDownList创建一个复合控件(它还包含一个Label)。

我的想法是,我可以像下拉列表一样使用我的控件,但也可以将标签扔到DDL前面的页面上。

我对TextBoxes的工作非常有效,但由于Collection(或Datasource)组件填充DDL,我正在努力使用DDL。

基本上我希望能够做到这样的事情:

<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>

问题是,我没有为我的控件扩展DropDownList类,所以我不能简单地使用那个魔法。我需要一些指针来弄清楚如何将我的控件(MyDropDownList)(目前只是System.Web.UI.UserControl)变成可以接受标签内的List项的东西,理想情况下,我希望能够插入它是一个数据源(与常规DDL提供的功能相同)。

我试着没有运气只是扩展常规DDL,但无法让Label组件随之飞行。

2 个答案:

答案 0 :(得分:1)

经过一些挖掘和搜索后,我找到了一个有效的解决方案。希望这将有助于其他人在未来:

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

答案 1 :(得分:0)

最简单的方法是回到扩展DropDownList控件的原始选项。你有什么问题让标签与它一起使用?那些问题可能更容易解决?