- 主要信息:
在我最近的项目中,我需要一个带有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)
答案 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控件树问题。