2017-01-11 1 views
0

Ich habe eine asp:panel, dass auf einen Button klicken, ich eine Anzahl von Checkboxen dynamisch hinzufügen.Dynamisch generierte Checkbox hat immer Checked == False auf Postback

Auf einen anderen Knopf klicken, muss ich diese Checkboxen ansehen und prüfen, ob sie überprüft werden.

Dies ist eine Follow-up-Frage zu einer, die ich zuvor gepostet habe. Das erste Problem war, dass ich die dynamisch erzeugten Steuerelemente beim Postback überhaupt nicht finden konnte.

Jetzt kann ich sie finden. Das Problem ist, dass die Eigenschaft Checked immer falsch ist, obwohl das Kontrollkästchen auf der Benutzeroberfläche aktiviert ist.

das Markup mit der Platte, die die Kontrollkästchen in platziert werden, und die beiden Tasten:

<asp:Panel runat="server" ScrollBars="Vertical" ID="pnlEmailCheckboxes" Height="150"> 
    <br/> 
    <asp:CheckBox runat="server" Text="Other" ID="cbOtherEmail"/> 
    <asp:TextBox ID="txtOtherEmail" runat="server" Style="width: 270px;" CssClass="textbox-default"></asp:TextBox> 
    <br/> 
</asp:Panel> 
<asp:LinkButton ID="btnSendEmail" Text="<span>Send Email</span>" runat="server" CssClass="page-footer-button-highlight" OnClick="btnSendEmail_Click"></asp:LinkButton> 
<asp:LinkButton ID="btnCloseEmail" Text="<span>Close</span>" runat="server" CssClass="page-footer-button" CausesValidation="false" OnClick="btnCloseEmail_OnClick"></asp:LinkButton> 

Falls die Textfelder erzeugt:

protected void btnEmail_Click(object sender, EventArgs e) 
{ 
    List<CheckBox> cbList = new List<CheckBox>(); 
    for (int i = 0; i < 10; i++) 
    { 
     CheckBox cb = new CheckBox(); 
     cb.Text = "text" + i; 
     cb.ID = Guid.newGuid().ToString(); 
     cb.ClientIDMode = ClientIDMode.Static; 
     pnlEmailCheckboxes.Controls.AddAt(0, cb); 
     pnlEmailCheckboxes.Controls.AddAt(0, new LiteralControl("<br/>")); 
     cbList.Add(cb); 
    } 

    Session["checkboxes"] = cbList; 
    mpeEmail.Show(); 
} 

Der Knopf, der die Textfelder abzurufen versucht (funktioniert nicht):

protected void btnSendEmail_Click(object sender, EventArgs e) 
{ 
    //the email recipients 
    List<string> emailRecipients = new List<string>(); 

    List<CheckBox> cbList = (List<CheckBox>)Session["checkboxes"]; 

    foreach (CheckBox cb in cbList) 
    { 
     CheckBox cbClient = (CheckBox) pnlEmailCheckboxes.FindControl(cb.ClientID); //I've also tried to find it by cb.ID 
     //ALWAYS FALSE 
     if (cbClient.Checked) emailRecipients.Add(cb.Text.Trim()); 
    } 

    //Ive also tried this, it does not contain the dynamically generated checkboxes 
    //var cbControls = pnlEmailCheckboxes.Controls.OfType<CheckBox>(); 
} 

Edit:

Die Client-Seite HTML zeigt sogar die mit der richtigen ID, die mit der ID übereinstimmt, die ich suche.

<input id="00e3a485-2083-4ef8-810b-6ed4fb1f62f9" type="checkbox" name="ctl00$Body$00e3a485-2083-4ef8-810b-6ed4fb1f62f9"> 
+0

Ich bevorzuge einen Repeater von Checkboxen, anstatt sie dynamisch hinzuzufügen. In Ihrem Fall müssen Sie nach dem Postback (OnLoad) noch einmal Checkboxen erstellen. Ähnliche Frage: http://stackoverflow.com/questions/17589268/dynamically-created-controls-losing-data-after-postback – Emanuele

+0

@Emanuele Ich erstelle tatsächlich die Kontrollen auf dem Postback, aber dieser Link führt mich zu der Erkenntnis, dass Die Steuerelemente, die neu erstellt werden, müssen dieselben IDs wie die alten Steuerelemente aufweisen, die den neu erstellten Steuerelementen zugeordnet werden sollen. Vielen Dank. –

+0

Schön. Kann ich vorschlagen, eine "kontrolliertere" Namenskonvention für Checkboxen zu verwenden? EG chk1, chk2 ... – Emanuele

Antwort

0

Dynamische Kontrollen müssen auf jedem Postback neu erstellt werden (was bereits geschah, da ich sie auf der Seite OnInit Funktion erstellen).

Das Problem ist jedoch, dass ich eine neu erstellte Guid als ID für jedes Steuerelement verwendet. Dadurch wurden die neu generierten Steuerelemente für jedes Postback nicht den Postdaten der alten Steuerelemente zugeordnet.

protected void btnEmail_Click(object sender, EventArgs e) 
{ 
    List<CheckBox> cbList = new List<CheckBox>(); 
    for (int i = 0; i < 10; i++) 
    { 
     CheckBox cb = new CheckBox(); 
     cb.Text = "text" + i; 

     //cb.ID = Guid.newGuid().ToString(); //don't do this. 
     cb.ID = "checkbox" + i; // <------ do this, have a consistent ID 

     cb.ClientIDMode = ClientIDMode.Static; 
     pnlEmailCheckboxes.Controls.AddAt(0, cb); 
     pnlEmailCheckboxes.Controls.AddAt(0, new LiteralControl("<br/>")); 
     cbList.Add(cb); 
    } 

    Session["checkboxes"] = cbList; 
    mpeEmail.Show(); 
} 
Verwandte Themen