Добавить возможность предоставлять элементы списка в составной элемент управления с DropDownLIst - PullRequest
1 голос
/ 07 мая 2010

Я создаю составной элемент управления для DropDownList (который также включает метку).

Идея заключается в том, что я могу использовать свой элемент управления, например, выпадающий список, но при этом он должен добавлять метку на страницу перед DDL.

У меня это отлично работает для TextBoxes, но я борюсь с DDL из-за компонента Collection (или Datasource) для заполнения 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, во что-то, что будет принимать элементы списка внутри тега, и в идеале я хотел бы иметь возможность подключить его к источник данных (те же функции, которые предлагает обычный DDL).

Я безуспешно пытался расширить обычный DDL, но не смог заставить компонент Label летать с ним.

Ответы [ 2 ]

1 голос
/ 08 мая 2010

После некоторого поиска и поиска я нашел решение, которое работает. Надеюсь, это поможет кому-то еще в будущем:

[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 голосов
/ 07 мая 2010

Проще всего вернуться к исходному варианту расширения элемента управления DropDownList. Какие проблемы у вас были, когда лейбл работал с ним? Эти проблемы, вероятно, легче решить?

...