【问题标题】:how to delete dynamic created textbox controls on dropdownlist selectedIndexChanged event and recreate new dynamic control on new selected value如何在下拉列表 selectedIndexChanged 事件上删除动态创建的文本框控件并在新选定值上重新创建新动态控件
【发布时间】:2013-12-07 06:00:46
【问题描述】:
    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。

我该如何解决这个问题。

请帮我解决这个问题。

提前致谢

【问题讨论】:

    标签: c# asp.net


    【解决方案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();
    
         }
       }      
    

    【讨论】:

    • 我必须在整个页面中使用相同的标签 ID 和文本框。因为我将这个动态创建的文本框的值存储到表中。
    • 嘿嘿!!不用担心,只需在标签的末尾添加 for 循环变量,然后在文本框的前面添加 for 循环变量即可:)
    • 怎么样?请给我看示例或在这里写一些代码好吗?
    • 如果我在标签和文本框之前和/或之后添加循环变量。但是在下拉列表 selectedchanged 事件上重新创建控件时,它将再次创建具有相同 ID 的相同控件。因为在调用 selectedchange 事件之前调用了 onload 事件。
    • hmm 调用 generateDynamicControls();页面加载事件中的 !ISPostBack() 事件中的方法
    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多