Получение динамически добавленных дочерних элементов управления для отображения в пользовательском интерфейсе - PullRequest
2 голосов
/ 20 декабря 2010

Я пытаюсь создать класс RadioButtonListWithOther, который расширяет RadoButtonList, но я не могу получить текстовое поле «Другое» для отображения на странице.Когда я делаю шаг во время отладки, я вижу элемент управления в коллекции элементов управления родительского элемента управления, но он все равно не отображается.Есть идеи, что я делаю здесь не так?

public class RadioButtonListWithOther : RadioButtonList
{
    private TextBox _otherReason;

    public RadioButtonListWithOther()
    {
        _otherReason = new TextBox();
        _otherReason.TextMode = TextBoxMode.MultiLine;
        _otherReason.Rows = 6;
        _otherReason.Width = Unit.Pixel(300);
        _otherReason.Visible = true;
    }

    protected override void CreateChildControls()
    {
        this.Controls.Add(_otherReason);
        this.EnsureChildControls();
        base.CreateChildControls();
    }

    protected override void OnSelectedIndexChanged(EventArgs e)
    {
        _otherReason.Enabled = false;

        if (OtherSelected())
        {
            _otherReason.Enabled = true;
        }

        base.OnSelectedIndexChanged(e);
    }

    public override string Text
    {
        get
        {
            if (OtherSelected())
            {
                return _otherReason.Text;
            }
            return base.Text;
        }
        set
        {
            base.Text = value;
        }
    }
    public override bool Visible
    {
        get
        {
            return base.Visible;
        }
        set
        {
            //Push visibility  changes down to the children controls
            foreach (Control control in this.Controls)
            {
                control.Visible = value;
            }
            base.Visible = value;
        }
    }

    private bool OtherSelected()
    {
        if (this.SelectedItem.Text == "Other")
        {
            return true;
        }
        return false;
    }
}

Вот мой код для добавления экземпляра этого элемента управления в WebForm:

protected override void CreateChildControls()
{
    var whyMentorOptions = new Dictionary<string, string>();
    whyMentorOptions.Add("Option 1", "1");
    whyMentorOptions.Add("Option 2", "2");
    whyMentorOptions.Add("Option 3", "3");
    whyMentorOptions.Add("Other", "Other");

    mentorWhy = new RadioButtonListWithOther
    {
        DataSource = whyMentorOptions
    };
    this.mentorWhy.DataTextField = "Key";
    this.mentorWhy.DataValueField = "Value";
    this.mentorWhy.DataBind();

    Form.Controls.Add(mentorWhy);

    base.CreateChildControls();
}

1 Ответ

2 голосов
/ 20 декабря 2010

Класс RadioButtonList полностью игнорирует дочерние элементы управления при рендеринге (его интересует только содержимое его коллекции Items ).

Вы должны будете визуализировать текстовое поле самостоятельно:

protected override void Render(HtmlTextWriter writer)
{
    base.Render(writer);
    _otherReason.RenderControl(writer);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...