繁体   English   中英

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

[英]Add dynamic ASP.NET controls via a DropDownList to the page

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

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

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

 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

在动态添加控件时,此后每次都必须将控件重新加载到控件树中才能显示。 借助viewstate,您可以将代码示例更改为:

ViewState("ShowTextbox") = true

然后在您的初始化例程中:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM