Почему флажки не рассматриваются как имеющие тип флажка?
Этот вопрос трансформировался из предыдущего здесь.
Кажется, что проблема на самом деле заключается в том, что не удается распознать флажки как таковые - есть ли проблема с обновлением базы данных после решения этой головоломки, еще предстоит выяснить.
Итак, вот код:
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim connStr As String = "SERVER=PLATYPUS42;DATABASE=duckbilldata;UID=entenhausen;PWD=pondscum"
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"
If TypeOf cntrl Is CheckBox 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
Я обновляю Label2.Text, чтобы увидеть, как далеко заходит код - и он попадает только в "foreach" - это последнее значение Label2.Text: "текст метки 2 из foreach"
Итак, эта строка:
If TypeOf cntrl Is CheckBox Then
... не может приравнять к истине.
Тем не менее, не только у меня есть много динамически созданных флажков в форме при нажатии кнопки, но есть и один, который я там сбросил во время разработки. Ни один из этих флажков не рассматривается как флажки, очевидно.
Почему бы и нет? Почему тип элемента управления checkbox не оценивается как CheckBox?
ПРИМЕЧАНИЕ: когда я добавляю "весь шебанг", вот так:
System.Web.UI.WebControls.CheckBox
...это не имеет значения; на самом деле, он скрывает "System.Web.UI.WebControls". часть.
ОБНОВИТЬ
Эта идея от Перри Мейсона вдохновила меня попробовать это:
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
... который показывает это:
Таким образом, флажок (среди прочего) воспринимается просто как "LiteralControl". Кажется довольно расплывчатым...
ОБНОВЛЕНИЕ 2
В ответ на Брэдли Аффнера вот код, который добавляет флажки:
For i As Integer = 0 To categoryDT.Rows.Count - 1
' for testing, limit count
If i > 3 Then 'There are thousands...just grab enough to fit on the page without scrolling for now...
Exit For
End If
Dim coName = New Label()
' Must prepend with something, as controls cannot share the same ID
coName.ID = "lbl" + i.ToString()
coName.Text = categoryDT.Rows(i)(0).ToString()
formCustCatMaint.Controls.Add(coName)
Dim chk = New CheckBox()
chk.ID = "ckbx" + i.ToString()
chk.Checked = True
formCustCatMaint.Controls.Add(chk)
' Add a "line break" after each checkbox
Dim l = New Label()
l.Text = "<br>"
formCustCatMaint.Controls.Add(l)
Next
ОБНОВЛЕНИЕ 3
Третья мысль: возможно, дело не в том, что флажки рассматриваются как System.Web.UI.LiteralControl, а в том, что они вообще не видны - даже те, которые были сброшены на форму / страницу во время разработки.
Почему я предлагаю эту радикальную идею? Потому что перечисляются только следующие элементы управления:
LiteralControl
HtmlHead
LiteralControl
HtmlForm
LiteralControl
Тем не менее, существует гораздо больше элементов управления, даже если не учитывать динамически генерируемые флажки. Нет кнопки, если только она не является одним из "LiteralControl".
Что-то гнилое, как все здесь.
ОБНОВЛЕНИЕ 4
Изменение Page_Load на Page_Init (по предложению Перри Мейсона) имело значение; Я получаю это:
Multiple controls with the same ID 'lbl0' were found. Trace requires that controls have unique IDs.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Web.HttpException: Multiple controls with the same ID 'lbl0' were found. Trace requires that controls have unique IDs.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
ОБНОВЛЕНИЕ 5
Я действительно не понимаю, почему существует несколько "lbl0", потому что i в цикле должен автоматически увеличиваться, верно? Это код:
For i As Integer = 0 To categoryDT.Rows.Count - 1
' for testing, limit count
If i > 3 Then 'There are thousands...just grab enough a few for now...
Exit For
End If
Dim coName = New Label()
' Must prepend with something, as controls cannot share the same ID
coName.ID = "lbl" + i.ToString()
coName.Text = categoryDT.Rows(i)(0).ToString()
formCustCatMaint.Controls.Add(coName)
Dim chk = New CheckBox()
chk.ID = "ckbx" + i.ToString()
chk.Checked = True
formCustCatMaint.Controls.Add(chk)
' Add a "line break" after each checkbox
Dim l = New Label()
l.Text = "<br>"
formCustCatMaint.Controls.Add(l)
Next
... и я, очевидно, увеличивается, потому что в противном случае "If i > 3" никогда не будет истинным, что и есть, потому что количество пар Label/CheckBox действительно сокращено.
Может ли быть так, что Page_Init вызывается несколько раз, и во второй раз он пытается добавить второй lbl0, и тогда происходит вышеописанное?
ОБНОВЛЕНИЕ 6
Это должно быть действительно верно (этот Page_Init) достигается несколько раз, потому что следующий код предотвратил ошибку:
Dim PageAlreadyInitted As Boolean = False
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If PageAlreadyInitted = True Then Exit Sub
PageAlreadyInitted = True
... но это не имеет значения, поскольку флажки находятся в цикле через элементы управления - я все еще получаю только LiteralControls, без кнопок, флажков и т. д.
ОБНОВЛЕНИЕ 7
FWIW, элементы управления создаются, как и ожидалось, как видно из этого фрагмента через "View Source":
<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>
1 ответ
Исправление оказалось простым и даже логичным задним числом.
Элементы управления динамически добавляются в форму, например:
formCustCatMaint.Controls.Add (coName) И так, заменив эту строку в цикле:
Для каждого cntrl как элемента управления в Me.Controls ... с этим:
Для каждого cntrl как элемента управления в formCustCatMaint.Controls И эта строка в функции GetLabelTextForID():
Для каждого cntrl как элемента управления в Me.Controls ... с этим:
Для каждого cntrl в качестве элемента управления в formCustCatMaint.Controls ... сделал свое дело. Элементы управления находятся, и код работает так, как задумано / изначально ожидалось.
Nebenbei bemerkt, теперь это тоже отлично работает:
If TypeOf cntrl Is CheckBox Then