Почему флажки в моей веб-форме невидимы для кода цикла управления?
ПРИМЕЧАНИЕ. Это связано с предыдущими вопросами здесь и здесь, но я думаю, что я сузил их до более ясного понимания проблемы.
Я вручную добавил флажок в приложение 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 "New" to "Existing" (uncheck any that should remain "New")" 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