c# - 如何在下拉列表 selectedIndexChanged 事件上删除动态创建的文本框控件并在新的选定值上重新创建新的动态控件

标签 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。

我该如何解决这个问题。

请帮我解决这个问题。

提前致谢

最佳答案

试试这个

将 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/

相关文章:

c# - 从 .NET 检查是否启用了 Windows 更新

c# - 集合已更改。未执行可能的盘点操作

c# - 在回发时从服务器端调用 javascript

asp.net - 为特定页面指定 MaxHttpCollectionKeys?

c# - 具有后备属性的 setter 中的 StackOverflowException

javascript - ExtJS 组合框有时隐藏在灰色的窗口后面

C# - 检查列表是否包含属性等于值的对象?

c# - 延迟加载在 EntityFramework 6 中不起作用

c# - 如何验证 JObject 是否属于特定类型

jquery - 使用 JQuery 禁用RequiredFieldValidators