C# 通过下拉列表向页面添加动态ASP.NET控件
-主要信息:C# 通过下拉列表向页面添加动态ASP.NET控件,c#,asp.net,dynamic,controls,C#,Asp.net,Dynamic,Controls,-主要信息: 在我最近的项目中,我需要有一个带有DropDownList的页面,其中包含一些项目,如“firstName”、“lastName”、“Age”等。当用户选择每个项目时,我想向页面添加可选控件。例如,当用户选择“年龄”时,另一个使用这些值动态创建的下拉列表:“小于10” “介于10和30之间” “超过30个” 下面是一个按钮,用于将此用户选择添加到列表框,并允许用户选择其他选项。(我最后根据用户的选择进行了查询并发送给db) -我的工作: 我创建了一个dropDownList,并将其
在我最近的项目中,我需要有一个带有DropDownList的页面,其中包含一些项目,如“firstName”、“lastName”、“Age”等。当用户选择每个项目时,我想向页面添加可选控件。例如,当用户选择“年龄”时,另一个使用这些值动态创建的下拉列表:“小于10”
“介于10和30之间”
“超过30个”
下面是一个按钮,用于将此用户选择添加到列表框,并允许用户选择其他选项。(我最后根据用户的选择进行了查询并发送给db)
-我的工作:
我创建了一个dropDownList,并将其AutoPostBack属性设置为true,并在其中添加了一些项,用户必须选择其中一项。然后,在回发页面之前,我将用户选择的dropDownList值添加到缓存变量中:
protected void DropDownListColumnNameSelectedIndexChanged(object sender, EventArgs e)
{
Cache["SelectedKey"] = dropDownListColumnName.SelectedValue;
}
当用户从dropDownList*dropDownList\u SelectedIndexChanged*中选择项目时,我必须在占位符中动态创建控件:
var textBoxName = new TextBox
{
ID = "textBoxName",
CssClass = "str-search-textbox-highlight",
ViewStateMode = ViewStateMode.Disabled
};
placeHolderFirstItem.Controls.Add(textBoxName);
-有什么问题吗?
当我尝试在当前按钮单击事件中添加新控件时,控件已成功添加到页面,但我无法通过占位符FirstItem.Controls.find(“textBoxName”)找到它,实际上占位符FirstItem.Controls.Count始终为零。因此我无法获取textBoxName.Text值。我尝试用谷歌搜索任何解决方案,发现一些解决方案必须在Page.OnInit中添加控件,因此我在覆盖的OnInit(e)中添加控件: 完成此操作后,我可以在Placeholder FirstItem中找到“textBoxName”,但它会在DropDownList\u SelectedIndexChanged之前触发
那么,当用户更改dropDownList值时,如何向placeholder添加新控件,以及如何读取新控件值?
提前感谢,
莫森 -更新:
这是更好的解决方案
()动态添加控件时,必须在此后每次将控件重新加载到控件树中,控件才会出现。在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来显示/隐藏要容易得多。感谢您的回复,但假设dropDownList中有大约10-15个项,它们必须在新的dropDownList中加载数据,我不认为这是一个正确的解决方案,隐藏和显示10-15个控件的每个帖子回来。我认为这不是一个完美的解决方案。我的编码解决方案没有使用显示/隐藏机制。。。而且您使用的是web表单,因此没有太多选项,除非您想在客户端完成所有操作,如果您发回,这将更成问题。
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);
}
}