Why are checkboxes on my Webform invisible to control loop code?

NOTE. This is related to previous questions here and here , but I think I've narrowed it down to a clearer understanding of what the problem is.

I manually added a checkbox to the Webforms application and generated the binding dynamically.

I want to iterate over these checkboxes and conditionally do something with an associated value, but the loop finds no checkboxes at all, even the one that was dropped in the Webform from the Toolbox at design time. This is the code that looks for checkboxes:

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

      

Note that I am trying to find some control with an ID that contains "ckbx" because the search for tags of type Checkbox failed. But this inexplicably fails.

This is what I see on the page, just before masking the button that runs the code above (as you can see, there are several checkboxes, most of which are dynamically generated during page_inte, on the page):

enter image description here

By selecting "View Source" just before flushing the button (which will cycle through the Control collection form), I see this:

    <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 </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>

      

So, all the flags are indicated and accounted for - so why does the loop blind with them?

Is there something else on the page that is preventing success here? If yes, maybe it can be seen from the whole set (web) and kaboodle from "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 </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>

      

+3


source to share


2 answers


The fix turned out to be simple and even logical in retrospect.

Controls are dynamically added to the form, for example:

formCustCatMaint.Controls.Add(coName)

      

So, replacing this line in a loop:

For Each cntrl As Control In Me.Controls

      

... with this:

For Each cntrl As Control In formCustCatMaint.Controls

      



And this line in the GetLabelTextForID () function:

For Each cntrl As Control In Me.Controls

      

... with this:

For Each cntrl As Control In formCustCatMaint.Controls

      



... did the trick. The controls are found and the code works as designed / originally expected.

Nebenbei bemerkt, now this works great:

If TypeOf cntrl Is CheckBox Then

      

0


source


Make sure you always recreate dynamically added controls. Try the ClientID property:

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

      



Assuming you add these dynamic controls to the placeholder, you can inspect the controls like this:

For Each cntrl As Control In PlaceHolderID.Controls

Next

      

+1


source







All Articles