2017-01-11 1 views
0

나는 버튼 클릭으로 동적으로 체크 박스를 추가하는 asp:panel을 가지고 있습니다.동적으로 생성 된 체크 박스는 항상 포스트 백에서 Checked == False를 나타냅니다.

다른 버튼을 클릭하면이 체크 박스를보고 선택되어 있는지 확인해야합니다.

이것은 이전에 게시 한 질문에 대한 후속 질문입니다. 첫 번째 문제는 포스트 백에서 동적으로 생성 된 컨트롤을 찾을 수 없다는 것입니다.

이제 찾을 수 있습니다. 문제는 Checked UI의 확인란을 선택 했는데도 항상 false 인 속성입니다.

체크 박스가에 배치받을 패널과 마크 업, 그리고 두 개의 버튼 :

<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

나는 리피터를 동적으로 추가하는 대신 확인란을 사용하는 것을 선호합니다. 귀하의 경우에는 다시 게시 (OnLoad) 후에 확인란을 다시 만들어야합니다. 비슷한 질문 : http://stackoverflow.com/questions/17589268/dynamically-created-controls-losing-data-after-postback – Emanuele

+0

@Emanuele 나는 포스트 백에 대한 컨트롤을 실제로 만들었지 만 링크를 통해 실현에 이르게되었습니다. 다시 작성되는 컨트롤은 다시 작성된 컨트롤에 매핑 할 이전 컨트롤과 동일한 ID를 가져야합니다. 감사. –

+0

니스. 확인란에 "더 제어 된"이름 지정 규칙을 사용하도록 제안 할 수 있습니까? EG chk1, chk2 ... – Emanuele

답변

0

동적 제어 (주어진 이미 일어나고 I 페이지 OnInit 함수들을 생성 하였다)에 각각 게시 다시 생성 할 필요가있다.

그러나 문제는 내가 새로 생성 된 Guid를 각 컨트롤의 ID로 사용하고 있다는 것입니다. 이로 인해 각 포스트 백에서 다시 생성 된 컨트롤이 이전 컨트롤의 포스트 데이터에 매핑되지 않았습니다.

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(); 
} 
관련 문제