나는 버튼 클릭으로 동적으로 체크 박스를 추가하는 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">
나는 리피터를 동적으로 추가하는 대신 확인란을 사용하는 것을 선호합니다. 귀하의 경우에는 다시 게시 (OnLoad) 후에 확인란을 다시 만들어야합니다. 비슷한 질문 : http://stackoverflow.com/questions/17589268/dynamically-created-controls-losing-data-after-postback – Emanuele
@Emanuele 나는 포스트 백에 대한 컨트롤을 실제로 만들었지 만 링크를 통해 실현에 이르게되었습니다. 다시 작성되는 컨트롤은 다시 작성된 컨트롤에 매핑 할 이전 컨트롤과 동일한 ID를 가져야합니다. 감사. –
니스. 확인란에 "더 제어 된"이름 지정 규칙을 사용하도록 제안 할 수 있습니까? EG chk1, chk2 ... – Emanuele