2017-01-11 8 views
0

У меня есть asp:panel, что при нажатии кнопки я добавляю некоторое количество флажков динамически.Проверяется динамически генерируемый флажок == False при обратной передаче

На другой щелчок на кнопке, мне нужно посмотреть эти флажки и проверить, отмечены ли они.

Это следующий вопрос, который я опубликовал ранее. Первая проблема заключалась в том, что я не мог найти динамически созданные элементы управления при обратной передаче.

Теперь я могу их найти. Проблема заключается в том, что свойство Checked всегда неверно, несмотря на то, что флажок установлен в пользовательском интерфейсе.

разметки с панелью, что флажки получить помещены в, и две кнопки:

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

Edit:

На стороне клиента html отображается даже с идентификатором, который соответствует 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 Я действительно создаю элементы управления для обратной передачи, однако эта ссылка приводит меня к осознанию того, что для повторного создания элементов управления необходимо иметь те же идентификаторы, что и старые элементы управления, которые должны быть сопоставлены с повторно созданными элементами управления. Благодарю. –

+0

Ницца. Могу ли я предложить использовать «более контролируемое» соглашение об именах для флажков? EG chk1, chk2 ... – Emanuele

ответ

0

Динамические элементы управления должны быть созданы заново на каждом постбэка (который уже происходит, поскольку я создавал их в функции страницы OnInit).

Однако проблема заключается в том, что я использовал новый генератор Guid в качестве идентификатора для каждого элемента управления. Это приводило к тому, что повторно созданные элементы управления на каждом обратном пути не отображались в 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(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^