从容器中查找动态添加的控件

时间:2014-05-27 07:13:19

标签: c# asp.net dynamic findcontrol

我正在下拉选定的索引更改事件中生成动态文本框控件。

  protected void ddlCategories_SelectedIndexChanged(object sender, EventArgs e)
    {
        foreach (Attributes attribute in getAllAttributes(Convert.ToInt32(ddlCategories.SelectedValue)))
        {
            Panel div = new Panel();

            div.Attributes.Add("class", "form-group");
            HtmlGenericControl lbl = new HtmlGenericControl("label");

            lbl.Attributes.Add("class", "col-lg-2 control-label");
            lbl.InnerText = attribute.Name;

            Panel innerdiv = new Panel();
            innerdiv.Attributes.Add("class", "col-lg-10");

            TextBox txt = new TextBox();
            txt.ID = attribute.ID.ToString();
            txt.Attributes.Add("class", "form-control");
            innerdiv.Controls.Add(txt);

            div.Controls.Add(lbl);
            div.Controls.Add(innerdiv);
            CustomAttributes.Controls.Add(div);

        }
    }

现在用户填写表单中的值后,我想获取动态生成的控件的值。但是CustomAttributes.findControls("")并不适合我。它一直都是null。

我也试过

var textBoxesInContainer = CustomAttributes.Controls.OfType<TextBox>();

但它也不起作用。

任何人都可以告诉我这里出了什么问题。

由于

2 个答案:

答案 0 :(得分:1)

最后我在搜索问题后找到了原因。这个问题的问题是视图状态。

在asp.net中,当页面回发时,它会丢失动态生成的控件的视图状态。因此,为了解决这个问题,我在回发时重新创建了页面加载事件中的控件。以这种方式,控件将被添加回当前页面,我可以在点击事件的按钮中找到这些控件。

感谢您的所有时间和指导。

答案 1 :(得分:0)

Panel div = new Panel();
Panel innerdiv = new Panel();
TextBox txt = new TextBox();

innerdiv.Controls.Add(txt);
div.Controls.Add(innerdiv);
CustomAttributes.Controls.Add(div);

CustomAttributes暂挂Panel。 试试这个:

var textboxes = CustomAttributes.Controls.OfType<Panel>()
    .Select(p => p.Controls.OfType<Panel>().First())
    .Select(p => p.Controls.OfType<TextBox>().First())