【发布时间】: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