![](/img/trans.png)
[英]How to add a control with an event handler dynamically to an update panel and have the event handler post back via AJAX
[英]How to add an event handler to control inside the same event handler?
我在AJAX更新面板中的一行中有2个Dropdownlists,其中有7个文本框; 每当我在第二个下拉列表中选择一个项目时,就需要创建新的控件行; 并将相同的事件处理程序添加到新创建的第二个下拉列表中。
问题不在第一行ddl中,因为它在HTML中; 但是当我在创建的新行ddl中选择一个新项目时,onSelectedIndexChanged不会触发,第二行消失!
有什么建议么??
我的HTML代码:
<asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <asp:DropDownList runat="server" ID="DropDownList1" CssClass="dropdownlist" EnableViewState="true"> <asp:ListItem>a</asp:ListItem> <asp:ListItem>b</asp:ListItem> </asp:DropDownList>                                          <asp:DropDownList runat="server" ID="DropDownList2" CssClass="dropdownlist" AutoPostBack="true" OnSelectedIndexChanged="DropDownList2_SelectedIndexChanged" EnableViewState="true"> <asp:ListItem>a</asp:ListItem> <asp:ListItem>b</asp:ListItem> </asp:DropDownList>                                   <asp:TextBox runat="server" ID="textbox1" CssClass="txtbx"></asp:TextBox>      <asp:TextBox runat="server" ID="textbox2" CssClass="txtbx"></asp:TextBox>      <asp:TextBox runat="server" ID="textbox3" CssClass="txtbx"></asp:TextBox>      <asp:TextBox runat="server" ID="textbox4" CssClass="txtbx"></asp:TextBox>      <asp:TextBox runat="server" ID="textbox5" CssClass="txtbx"></asp:TextBox>      <asp:TextBox runat="server" ID="textbox6" CssClass="txtbx"></asp:TextBox>     <asp:TextBox runat="server" ID="textbox7" CssClass="txtbx"></asp:TextBox> <br /> <br /> </ContentTemplate> </asp:UpdatePanel>
后面的代码:
public partial class WebForm1 : System.Web.UI.Page
{
DropDownList ddl1;
DropDownList ddl2;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Session["ddlcounter"] = 1;
}
}
protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e)
{
ddl1 = new DropDownList();
ddl1.ID = "ddl1_" + (int)Session["ddlcounter"];
ddl1.Width = 200;
ddl1.Height = 30;
ddl1.Items.Add("a");
ddl1.Items.Add("b");
UpdatePanel1.ContentTemplateContainer.Controls.Add(ddl1);
UpdatePanel1.ContentTemplateContainer.Controls.Add(new LiteralControl("                                          "));
ddl2 = new DropDownList();
ddl2.ID = "ddl2_" + (int)Session["ddlcounter"];
ddl2.Width = 200;
ddl2.Height = 30;
ddl2.Items.Add("a");
ddl2.Items.Add("b");
ddl2.AutoPostBack = true;
UpdatePanel1.ContentTemplateContainer.Controls.Add(ddl2);
UpdatePanel1.ContentTemplateContainer.Controls.Add(new LiteralControl("                                      "));
ddl2.SelectedIndexChanged += new EventHandler(DropDownList2_SelectedIndexChanged);
Session["txtcounter"] = 1;
for (int i = 0; i < 7; i++)
{
TextBox txt = new TextBox();
txt.Width = 45;
txt.Height = 25;
UpdatePanel1.ContentTemplateContainer.Controls.Add(txt);
UpdatePanel1.ContentTemplateContainer.Controls.Add(new LiteralControl("     "));
Session["txtcounter"] = (int)Session["txtcounter"] + 1;
}
UpdatePanel1.ContentTemplateContainer.Controls.Add(new LiteralControl("<br /><br />"));
Session["ddlcounter"] = (int)Session["ddlcounter"] + 1;
}
}
我相信问题在于,当第二个动态生成的ddl回发时,无法记住上一步中动态呈现的控件。
我建议你阅读这篇文章 ; 我认为您错过了最后一步,即上述链接中的RecreateControls函数。
希望能有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.