jjr2527
jjr2527

Reputation: 440

Getting dynamically added child controls to display in the UI

I am trying to create a RadioButtonListWithOther class that extends the RadoButtonList but I can't get the "Other" textbox to render on the page. When I step through while debugging I can see the control in the parent control's Controls collectio but it still doesn't render. Any ideas what I am doing wrong here?

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

Here is my code to add an instance of this control to the 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();
}

Upvotes: 2

Views: 471

Answers (1)

Fr&#233;d&#233;ric Hamidi
Fr&#233;d&#233;ric Hamidi

Reputation: 263047

The RadioButtonList class completely ignores its child controls when rendering (it's only interested in the contents of its Items collection).

You'll have to render the text box yourself:

protected override void Render(HtmlTextWriter writer)
{
    base.Render(writer);
    _otherReason.RenderControl(writer);
}

Upvotes: 2

Related Questions