2017-01-11 78 views
0

我有一個asp:panel,在按鈕上點擊,我添加一些複選框動態。動態生成複選框總是檢查==假回發

在另一個按鈕上單擊,我需要查看這些複選框並檢查它們是否被選中。

這是我之前發佈的一個跟進問題。第一個問題是我在回發中找不到動態生成的控件。

現在,我可以找到它們。問題是Checked屬性始終爲false,儘管在UI上檢查了複選框。

與複選框得到安置到面板的標記,並且兩個按鈕:

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

生成該文本框的事件:

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(); 
} 

試圖檢索文本框按鈕(不起作用):

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>(); 
} 

編輯:

客戶端HTML甚至顯示與正在搜索的ID匹配的正確ID。

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

我更喜歡使用複選框的Repeater而不是動態添加它們。在你的情況下,你必須在回發(OnLoad)之後再次創建複選框。類似的問題:http://stackoverflow.com/questions/17589268/dynamically-created-controls-losing-data-after-postback – Emanuele

+0

@Emanuele我的確在創建回發控件,但是這個鏈接讓我意識到重新創建的控件需要與舊控件具有相同的ID以映射到重新創建的控件。謝謝。 –

+0

不錯。我可以建議爲複選框使用「更受控制」的命名約定嗎? EG chk1,chk2 ... – Emanuele

回答

0

動態控件需要在每次回發重新創建(這是已經發生的事情,因爲我是在OnInit頁面功能創建它們)。

但是,問題在於我使用新生成的Guid作爲每個控件的ID。這導致每次回發的重新生成的控件不會映射到舊控件的postdata。

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(); 
}