2016-07-10 18 views
0

Ich habe 2 Dropdownlisten mit 7 Textfeldern in einer Zeile im AJAX Update Panel; Ich muss eine neue Reihe von Kontrollen jedes Mal erstellen, wenn ich ein Element in der zweiten Dropdown-Liste auswähle; und fügen Sie den gleichen Eventhandler zu der neu erstellten zweiten Dropdown-Liste hinzu ... usw.Wie füge ich einen Event-Handler hinzu, um innerhalb desselben Event-Handlers zu steuern?

das Problem ist nicht in der ersten Zeile ddl, weil es in HTML ist; aber wenn ich ein neues Element in der erstellten neuen Zeile ddl auswählen, wird die onSelectedIndexChanged nicht ausgelöst, und die zweite Zeile verschwindet !!

Irgendwelche Vorschläge ??

Mein HTML-Code:

<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> 
 
          &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp 
 
         <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> 
 
          &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp 
 
         <asp:TextBox runat="server" ID="textbox1" CssClass="txtbx"></asp:TextBox> 
 
          &nbsp&nbsp&nbsp&nbsp 
 
         <asp:TextBox runat="server" ID="textbox2" CssClass="txtbx"></asp:TextBox> 
 
          &nbsp&nbsp&nbsp&nbsp 
 
         <asp:TextBox runat="server" ID="textbox3" CssClass="txtbx"></asp:TextBox> 
 
          &nbsp&nbsp&nbsp&nbsp 
 
         <asp:TextBox runat="server" ID="textbox4" CssClass="txtbx"></asp:TextBox> 
 
          &nbsp&nbsp&nbsp&nbsp 
 
         <asp:TextBox runat="server" ID="textbox5" CssClass="txtbx"></asp:TextBox> 
 
          &nbsp&nbsp&nbsp&nbsp 
 
         <asp:TextBox runat="server" ID="textbox6" CssClass="txtbx"></asp:TextBox> 
 
          &nbsp&nbsp&nbsp 
 
         <asp:TextBox runat="server" ID="textbox7" CssClass="txtbx"></asp:TextBox> 
 
          <br /> 
 
          <br /> 
 
         </ContentTemplate> 
 
        </asp:UpdatePanel>

-Code hinter:

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("&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp")); 

     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("&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp")); 

     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("&nbsp&nbsp&nbsp&nbsp&nbsp")); 
      Session["txtcounter"] = (int)Session["txtcounter"] + 1; 
     } 
     UpdatePanel1.ContentTemplateContainer.Controls.Add(new LiteralControl("<br /><br />")); 
     Session["ddlcounter"] = (int)Session["ddlcounter"] + 1; 
    } 
} 

Antwort

0

ich glaube, das Problem ist, dass, wenn der zweite ddl postsback dynamisch generiert, da ist keine Möglichkeit sich zu erinnern Was waren die dynamisch gerenderten Steuerelemente im vorherigen Schritt?

Ich schlage vor, Sie gehen durch this article; Ich denke, Sie verpassen den letzten Schritt, d. H. Die RecreateControls Funktion in der oben genannten Link.

Hoffe, dass hilft.

+0

danke @Rafi, wenn ich die Steuerelemente für jeden Postback neu erstellen; Ich verliere die Werte, also, gibt es eine Möglichkeit, wiederholte Kontrollen auf der Client-Seite zu erstellen ?? ist es wert, JS zu verwenden ?? –

+0

Ich habe dynamische Sets von Steuerelementen mit Javascipt und JQuery erstellt, so dass es eine würdige Option ist, meiner Meinung nach zu berücksichtigen. Das behebt jedoch nicht das Problem von Post-Backs, wenn Sie auf der Webseite einen solchen Befehl ausführen. – Rafi