如何在dropdownlist selectedIndexChanged事件中删除动态创建的文本框控件,并在新选定值上创建新的动态控件

时间:2013-12-07 06:00:47

标签: c# asp.net

    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 = "&nbsp;";
            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。

我该如何解决这个问题。

请帮我解决这个问题。

提前致谢

1 个答案:

答案 0 :(得分:1)

试试这个

将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();

     }
   }