在事件中访问动态添加到占位符的控件
我基于下拉列表中选定的值动态创建ASP.NET控件;例如该字段可以是文本框或复选框(现在),然后将其添加到占位符控件。但是,我不确定如何检索值 - 使用占位符的FindControl
方法返回null,尽管我在创建控件时指定了ID。在事件中访问动态添加到占位符的控件
这里是我的代码:
protected void ddlFields_SelectedIndexChanged(object sender, EventArgs e) {
// this simply gives me back an object with some properties
// such as the type of field (e.g. text, boolean, number)
var column = GetFieldDetailsByValue(ddlFields.SelectedValue);
this.CreateInputControl(column.Type);
}
private void CreateInputControl(string dataType) {
Control controlToAdd = null;
switch (dataType) {
case TYPE_STRING:
case TYPE_NUMBER:
controlToAdd = new TextBox();
break;
case TYPE_BOOL:
controlToAdd = new CheckBox();
break;
}
if (controlToAdd != null) {
controlToAdd.ID = "ctlFieldValue";
this.fieldsPlaceholder.Controls.Add(controlToAdd);
}
}
我有检查的ctlFieldValue
控制来获取它的值按钮事件,但是它总是空。我应该如何处理这个问题?
在回发期间您能够检索该值的唯一方法是如果您以完全相同的方式创建控件集合。因此,如果您在事件中添加控件,则在回发时,您需要在同一父控件内创建完全相同的控件(使用相同的ID)。
不幸的是 - 在回发事件期间添加控件时很难做到这一点。我过去所做的是使用ViewState来跟踪在回发期间应该创建哪些控件。尽管如此,可能还有更好的方法,但是执行ViewState路由似乎可行。
您始终可以直接从Request.Form集合中读取已发布的值。
啊哈,我完全忘了我可以用旧的方式访问它。我得检查一下。编辑:其实也没有工作;它仍然是空的。 – 2011-03-30 13:14:40
真的吗?你确定这个东西正在POST'd?抓住提琴手,看看原始的请求。 – asawyer 2011-04-05 15:08:54
你什么时候创建这些控件?在OnPreInit? – citronas 2011-03-30 13:09:12
它是在下拉菜单的SelectedIndexChanged事件中创建的,因为我需要在选择它之后根据该值确定控件。 – 2011-03-30 13:11:09