【问题标题】:Add dynamic ASP.NET controls via a DropDownList to the page通过 DropDownList 向页面添加动态 ASP.NET 控件
【发布时间】:2014-01-22 00:38:34
【问题描述】:

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

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)

【问题讨论】:

    标签: c# asp.net dynamic controls


    【解决方案1】:

    当您动态添加控件时,您必须每次都将控件重新加载到控件树中才能显示出来。在 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);
            }
        }
    

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

    【讨论】:

    • 感谢您的回复,但假设我们在 dropDownList 中有大约 10 - 15 个项目,它们必须将它们的数据加载到新的 dropDownList 中,我认为这不是隐藏和显示的正确解决方案每个回帖有 10 - 15 个控件。我认为这不是一个完美的解决方案。
    • 我的编码解决方案没有使用显示/隐藏机制...而且您正在使用 Web 表单,所以没有太多选择,除非您想在客户端做所有事情,甚至如果您回帖,问题会更大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2010-10-17
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多