Почему флажки в моей веб-форме невидимы для кода цикла управления?

ПРИМЕЧАНИЕ. Это связано с предыдущими вопросами здесь и здесь, но я думаю, что я сузил их до более ясного понимания проблемы.

Я вручную добавил флажок в приложение Webforms и динамически генерирую еще кучу.

Я хочу зациклить эти флажки и условно сделать что-то со связанным значением, но цикл вообще не находит флажки, даже те, которые были сброшены в веб-форме из панели инструментов во время разработки. Это код, который ищет флажки:

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim connStr As String = "SERVER=dishwasher;DATABASE=restaurant;UID=jack;PWD=london"
    Dim upd8DML As String = "UPDATE CustomerCategoryLog SET Category = 'Exploding' WHERE Unit = @Unit And MemberNo = @MemberNo AND Custno = @CustNo"

    Dim coName As String
    Dim argVals(2) As String
    Dim _Unit As String
    Dim _MemberNo As String
    Dim _CustNo As String
    Dim curCheckboxIDVal As String
    Label2.Text = "label 2 text from button1_click"
    LabelDebug.Text = "label debug text from button1_click"

    For Each cntrl As Control In Me.Controls
        Label2.Text = "label 2 text from foreach"
        LabelDebug.Text = LabelDebug.Text + " " + cntrl.GetType().ToString + " "
        'If TypeOf cntrl Is System.Web.UI.WebControls.CheckBox Then
        If String.IsNullOrEmpty(cntrl.ID) then Continue For
        If cntrl.ID.ToString().Contains("ckbx") Then
            Label2.Text = "label 2 text from is checkbox"
            If DirectCast(cntrl, CheckBox).Checked = True Then
                Label2.Text = "label 2 text from checked"
                curCheckboxIDVal = CStr(DirectCast(cntrl, CheckBox).ID)
                coName = GetLabelTextForID(curCheckboxIDVal)
                argVals = GetArgValsForCompanyName(coName)
                _Unit = argVals(0)
                _MemberNo = argVals(1)
                _CustNo = argVals(2)
                Label2.Text = _Unit
                LabelDebug.Text = _MemberNo
                Using conn As New SqlConnection(connStr), _
                    cmd As New SqlCommand(upd8DML, conn)
                    cmd.Parameters.Add("@Unit", SqlDbType.VarChar, 50).Value = _Unit
                    cmd.Parameters.Add("@MemberNo", SqlDbType.VarChar, 50).Value = _MemberNo
                    cmd.Parameters.Add("@CustNo", SqlDbType.VarChar, 50).Value = _CustNo
                    conn.Open()
                    cmd.ExecuteScalar()
                End Using
            End If
        End If
    Next
End Sub

Обратите внимание, что я пытаюсь найти любой элемент управления с идентификатором, который содержит "ckbx", так как поиск элементов типа Checkbox не удался. Но и это необъяснимо не удается.

Это то, что я вижу на странице как раз перед тем, как нажимать на кнопку, запускающую приведенный выше код (как вы можете видеть, есть несколько флажков, большинство из которых динамически генерируются во время Page_Init на странице):

Выбрав "View Source" непосредственно перед нажатием кнопки (которая будет циклически перебирать коллекцию Control формы), я вижу это:

    <input id="CheckBox1" type="checkbox" name="CheckBox1" />
    <p>
        <span id="LabelDebug">label debug text from page_load</span>
    </p>
<span id="lbl0"> AMC THEATRES - TYSON CORNER 16</span><input id="ckbx0" type="checkbox" name="ckbx0" checked="checked" /><span><br></span><span id="lbl1"> GSO AIRPORT - ACC</span><input id="ckbx1" type="checkbox" name="ckbx1" checked="checked" /><span><br></span><span id="lbl2"> LONGHORN - DES PLAINS</span><input id="ckbx2" type="checkbox" name="ckbx2" checked="checked" /><span><br></span><span id="lbl3"> MAGGIE'S </span><input id="ckbx3" type="checkbox" name="ckbx3" checked="checked" /><span><br></span><span id="lbl4"> OAKRIDGE NURSING & REHAB NO LGER FB 11296</span><input id="ckbx4" type="checkbox" name="ckbx4" checked="checked" /><span><br></span><span id="lbl5"> SKYPORT - WOODY CREEK B&C DIA C-C </span><input id="ckbx5" type="checkbox" name="ckbx5" checked="checked" /><span><br></span><span id="lbl6"> UNIV NORTH CAROLINA - CHARLOTTE - BAKERY #32936</span><input id="ckbx6" type="checkbox" name="ckbx6" checked="checked" /><span><br></span><span id="lbl7">"DRAKE ""SIMPLY TO GO/OLMSTED #2"</span><input id="ckbx7" type="checkbox" name="ckbx7" checked="checked" /><span><br></span><span id="lbl8">"DRAKE CENTER   SCS""OLD ACCOUNT"""</span><input id="ckbx8" type="checkbox" name="ckbx8" checked="checked" /><span><br></span><span id="lbl9">"HUT, THE - EMORY & HENRY"</span><input id="ckbx9" type="checkbox" name="ckbx9" checked="checked" /><span><br></span><span id="lbl10">"THOMAS MORE COLLEGE   SCS ""OLD"""</span><input id="ckbx10" type="checkbox" name="ckbx10" checked="checked" /><span><br></span><span id="lbl11">"WRIGHT STATE ""C"" STORE  SCS"</span><input id="ckbx11" type="checkbox" name="ckbx11" checked="checked" /><span><br></span></form>

Итак, все чекбоксы присутствуют и учитываются - так почему же петля закрыта для них?

Есть ли что-то еще на странице, которая мешает успеху здесь? Если это так, возможно, это можно различить по всему (веб) набору и kaboodle из "View Source":

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
    Customer Category Maintenance
</title></head>
<body>
    <form name="formCustCatMaint" method="post" action="custmaint_categoryadmin.aspx" id="formCustCatMaint">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTE1Mzg3MzEyNA9kFgICAw9kFgQCBQ8PFgIeBFRleHQFG2xhYmVsIDIgdGV4dCBmcm9tIHBhZ2VfbG9hZGRkAgkPDxYCHwAFH2xhYmVsIGRlYnVnIHRleHQgZnJvbSBwYWdlX2xvYWRkZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WDQUJQ2hlY2tCb3gxBQVja2J4MAUFY2tieDEFBWNrYngyBQVja2J4MwUFY2tieDQFBWNrYng1BQVja2J4NgUFY2tieDcFBWNrYng4BQVja2J4OQUGY2tieDEwBQZja2J4MTEOVoGeHarmK0RaIVFgiYF1MfX7+A==" />
</div>

<div>

    <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="2AC5B239" />
    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWDwL10YNmAoznisYGAoLk17sJAsO3wKgLAsS3wKgLAsG3wKgLAsK3wKgLAse3wKgLAsi3wKgLAsW3wKgLAsa3wKgLAru3wKgLAry3wKgLAsS3gKgLAsS3/KcLI6zphO0y3z+gPnFXloHFrZsHghg=" />
</div>
        <input type="submit" name="Button1" value="Update checked from &quot;New&quot; to &quot;Existing&quot; (uncheck any that should remain &quot;New&quot;)" id="Button1" style="width:612px;" />
        <span id="Label1"><br></span>
        <span id="Label2">label 2 text from page_load</span>
        <input id="CheckBox1" type="checkbox" name="CheckBox1" />
        <p>
            <span id="LabelDebug">label debug text from page_load</span>
        </p>
    <span id="lbl0"> AMC THEATRES - TYSON CORNER 16</span><input id="ckbx0" type="checkbox" name="ckbx0" checked="checked" /><span><br></span><span id="lbl1"> GSO AIRPORT - ACC</span><input id="ckbx1" type="checkbox" name="ckbx1" checked="checked" /><span><br></span><span id="lbl2"> LONGHORN - DES PLAINS</span><input id="ckbx2" type="checkbox" name="ckbx2" checked="checked" /><span><br></span><span id="lbl3"> MAGGIE'S </span><input id="ckbx3" type="checkbox" name="ckbx3" checked="checked" /><span><br></span><span id="lbl4"> OAKRIDGE NURSING & REHAB NO LGER FB 11296</span><input id="ckbx4" type="checkbox" name="ckbx4" checked="checked" /><span><br></span><span id="lbl5"> SKYPORT - WOODY CREEK B&C DIA C-C </span><input id="ckbx5" type="checkbox" name="ckbx5" checked="checked" /><span><br></span><span id="lbl6"> UNIV NORTH CAROLINA - CHARLOTTE - BAKERY #32936</span><input id="ckbx6" type="checkbox" name="ckbx6" checked="checked" /><span><br></span><span id="lbl7">"DRAKE ""SIMPLY TO GO/OLMSTED #2"</span><input id="ckbx7" type="checkbox" name="ckbx7" checked="checked" /><span><br></span><span id="lbl8">"DRAKE CENTER   SCS""OLD ACCOUNT"""</span><input id="ckbx8" type="checkbox" name="ckbx8" checked="checked" /><span><br></span><span id="lbl9">"HUT, THE - EMORY & HENRY"</span><input id="ckbx9" type="checkbox" name="ckbx9" checked="checked" /><span><br></span><span id="lbl10">"THOMAS MORE COLLEGE   SCS ""OLD"""</span><input id="ckbx10" type="checkbox" name="ckbx10" checked="checked" /><span><br></span><span id="lbl11">"WRIGHT STATE ""C"" STORE  SCS"</span><input id="ckbx11" type="checkbox" name="ckbx11" checked="checked" /><span><br></span></form>
</body>
</html>

2 ответа

Решение

Исправление оказалось простым и даже логичным задним числом.

Элементы управления динамически добавляются в форму, например:

formCustCatMaint.Controls.Add(coName)

И так, заменив эту строку в цикле:

For Each cntrl As Control In Me.Controls

...с этим:

For Each cntrl As Control In formCustCatMaint.Controls

И эта строка в функции GetLabelTextForID():

For Each cntrl As Control In Me.Controls

...с этим:

For Each cntrl As Control In formCustCatMaint.Controls

... сделал свое дело. Элементы управления находятся, и код работает так, как задумано / изначально ожидалось.

Nebenbei bemerkt, теперь это тоже отлично работает:

If TypeOf cntrl Is CheckBox Then

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

If cntrl.ClientID.ToString().Contains("ckbx") Then
    'Do Something
End If

Предполагая, что вы добавляете эти динамические элементы управления в заполнитель, вы можете проверить элементы управления из этого:

For Each cntrl As Control In PlaceHolderID.Controls

Next
Другие вопросы по тегам