Aspx page:
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<asp:placeholder id="container" runat="server" visible="false"></asp:placeholder>
</td>
</tr>
</table>
On Code Behind file:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
generateDynamicControls();
}
private void generateDynamicControls()
{
for (int i = 0; i < dt.Rows.Count; i++)
{
HtmlGenericControl tr = new HtmlGenericControl("tr");
HtmlGenericControl td1 = new HtmlGenericControl("td");
Label lbl = new Label();
lbl.ID = "lbl" + dt.Rows[i]["sSubjectName"].ToString();
lbl.Text = dt.Rows[i]["sSubjectName"].ToString() + " :";
lbl.Width = new Unit(170);
lbl.Style.Add("padding-left", "10px");
lbl.Style.Add("font-weight", "bold");
td1.Controls.Add(lbl);
tr.Controls.Add(td1);
HtmlGenericControl td2 = new HtmlGenericControl("td");
TextBox txtBox = new TextBox();
txtBox.ID = "txt" + dt.Rows[i]["sSubjectName"].ToString();
txtBox.CssClass = "TxtBox";
txtBox.TextMode = TextBoxMode.MultiLine;
txtBox.Width = new Unit(840);
td2.Style.Add("colspan", "3");
td2.Controls.Add(txtBox);
tr.Controls.Add(td2);
container.Controls.Add(tr);
HtmlGenericControl tr1 = new HtmlGenericControl("tr");
HtmlGenericControl td3 = new HtmlGenericControl("td");
td3.Style.Add("colspan", "4");
td3.InnerHtml = " ";
tr1.Controls.Add(td3);
container.Controls.Add(tr1);
//container.Controls.Add(new LiteralControl("<br />"));
//LiteralControl literalBreak = new LiteralControl();
//literalBreak.Text ="</br>";
}
container.Visible = true;
}
}
`dt(datatable)` is filled from other function.
这工作正常,控件创建正确。
但我想在下拉列表的选定更改事件上重新创建此动态控件。但在重新创建这些控件之前,我必须删除以前创建的控件。
我已尝试在下拉列表中选择更改事件中的以下代码来删除这些控件并重新创建新控件。
for (int i = 0; i < dt.Rows.Count; i++)
{
container.Controls.Remove(container.FindControl(dt.Rows[i]["nSubjectId"].ToString()));
}
generateDynamicControls();
但它不起作用并给我以下错误。因为已经首先调用了 onload 事件并创建了动态控件。
找到了具有相同 ID“lblOrals”的多个控件。 FindControl 要求控件具有唯一 ID。
我该如何解决这个问题。
请帮我解决这个问题。
提前致谢
最佳答案
试试这个
将 for 循环变量 (i) 赋给你的标签 id,如下面的方式
lbl.ID = "lbl" + dt.Rows[i]["sSubjectName"].ToString()
+i.ToString();//i is loop variable for coordinated with labelid.
现在如果 "dt.Rows[i]["sSubjectName"]"
返回 "LabeleName"
,当 for 循环将分配值时
dt.Rows[i]["sSubjectName"].ToString() + i.ToString()
,所以返回值如"LabeleName1"
最后你得到了标签 id 是下面的名字
lblLabeleName1
lblLabeleName2
lblLabeleName3
.
.
.
.etc
文本框就像
txtBox.ID = "txt" + dt.Rows[i]["sSubjectName"].ToString() + i.ToString();
结果是
txtLabeleName1
txtLabeleName2
txtLabeleName3
.
.
.
etc.
像这样删除字段代码
//For label
container.Controls.Remove(container.FindControl("lbl" + dt.Rows[i]["sSubjectName"].ToString() +i.ToString()));
//For TextBox
container.Controls.Remove("txt" + dt.Rows[i]["sSubjectName"].ToString()+ i.ToString() ));
并且应该调用 generateDynamicControls();页面加载事件中 !ISPostBack() 事件中的方法
喜欢
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if(!IsPostBack)
{
generateDynamicControls();
}
}
关于c# - 如何在下拉列表 selectedIndexChanged 事件上删除动态创建的文本框控件并在新的选定值上重新创建新的动态控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20438247/