通过DropDownList将动态ASP.NET控件添加到页面

时间:2014-01-04 09:00:24

标签: c# asp.net dynamic controls

- 主要信息:
在我最近的项目中,我需要一个带有DropDownList的页面,其中包含一些项目,如'firstName','lastName','Age'等。我想在用户选择的每个项目时向页面添加可选控件。例如,当用户选择“年龄”时,使用这些值动态创建另一个下拉列表:“小于10” '在10到30之间' '超过30' 这是一个按钮,可以将此用户选择添加到listBox,并允许用户选择其他选项。 (我根据用户选择最后查询并发送给db)
- 我做什么:
我创建了一个dropDownList并将其 AutoPostBack 属性设置为 true ,并在其中添加了一些项目,用户必须选择其中一个项目。然后我在发回页面回发之前在Cache变量中添加dropDownList的用户SelectedValue:

protected void DropDownListColumnNameSelectedIndexChanged(object sender, EventArgs e)
    {
        Cache["SelectedKey"] = dropDownListColumnName.SelectedValue;
    }

当用户从dropDownList * DropDownList_SelectedIndexChanged * fire中选择一个项目时,我必须在占位符中动态创建控件:

 var textBoxName = new TextBox
    {
        ID = "textBoxName",
        CssClass = "str-search-textbox-highlight",
        ViewStateMode = ViewStateMode.Disabled
    };
 placeHolderFirstItem.Controls.Add(textBoxName);

- 有什么问题? 当我尝试在当前的Button_Click事件中添加新控件时,控件成功添加到页面但我无法通过 placeHolderFirstItem.Controls.Find(“textBoxName”)找到它实际上 placeHolderFirstItem.Controls.Count 始终为零。所以我无法获得textBoxName.Text值 我尝试谷歌搜索任何解决方案,我发现一些解决方案,我必须在Page.OnInit中添加控件,所以我在重写的OnInit(e)中添加控件:

protected override void OnInit(EventArgs e)
        {
            if (!Page.IsPostBack) return;
            var textBoxName = new TextBox
               {
                   ID = "textBoxName",
                   CssClass = "str-search-textbox-highlight",
                   ViewStateMode = ViewStateMode.Disabled
               };
            placeHolderFirstItem.Controls.Add(textBoxName);
        }

执行此操作后,我可以在placeHolderFirstItem中找到“textBoxName”,但它会在 DropDownList_SelectedIndexChanged 之前触发! 那么如何在用户更改dropDownList值时添加新控件以准确放置持有者?如何读取新控件值?
提前谢谢,
穆赫辛。

- 已更新:
这是更好的解决方案
http://forums.asp.net/p/1959726/5596531.aspx?p=True&t=635244790943067485&pagenum=1

1 个答案:

答案 0 :(得分:0)

当您动态添加控件时,您必须每次都将控件重新加载到控件树中,以便显示它。在viewstate的帮助下,您可以将代码示例更改为:

ViewState("ShowTextbox") = true

然后在你的init例程中:

protected override void OnInit(EventArgs e)
    {
        if (!Page.IsPostBack) return;

        if (ViewState("ShowTextBox") == true) {
           var textBoxName = new TextBox
           {
               ID = "textBoxName",
               CssClass = "str-search-textbox-highlight",
               ViewStateMode = ViewStateMode.Disabled
           };
           placeHolderFirstItem.Controls.Add(textBoxName);
        }
    }

请注意,控制树上的控件要容易得多,然后通过将Visible设置为true / false来显示/隐藏,因为这些ASP.NET控件树问题。