I'm having problems looping through controls that are on my user control.
I have tried the following code, but cannot get it to find the checkboxes that are on the user control. (You can see some of my previous attempts that I have commented out.)
'For Each Ctrl As Control In Page.Controls
'For Each Ctrl As Control In Me.Page.Controls
'For Each ctrl As Control In Request.Form
'''Dim frm As Control = Me.FindControl("frmDefault")
'''For Each Ctrl As Control In frm.Controls
Dim Check As CheckBox
For Each Ctrl As Control In Me.Controls
If TypeOf Ctrl Is CheckBox Then
Check = Ctrl
' Do something here...
End If
Next
There are multiple chekcboxes on the user control. The code shown above is on the code behind page for the user control.
(The user control is being used in conjunction with my CMS, Sitecore. I'm not sure if this has any effect on the problem I am experiencing or not.)
Any suggestions?
Sitecore has no effect on walking through the control-collection, this should be possible.
Are you looping through the right Control-Collection? Is Me.Controls your Page-, UserControl- or RepeaterItems-Control collection (or another collection)?
If the checkboxes are nested in another control, you need to walk to that control-collection.
Maybe you should add your .ascx code so we can see what your control-collection looks like.
Does this bring up the names of the checkboxes?
For Each Ctrl As Control In Me.Controls
If TypeOf Ctrl Is CheckBox Then
MsgBox(Ctrl.Name)
End If
Next
That should let you know if you are hitting you checkboxes. If not rexamine your page design.
I believe you should have no problem assigning ctrl to check, it should act as a pointer to ctrl. If you have more than one checkbox on the page, do an if statement against the ctrl.name to get the correct one.
I finally figured out what is going on.
I have the checkboxes inside different tables. These tables contains runat="server". This table is inside a Div tag that also contains a runat="server".
My code could never find the checkboxes because of this. I had to add a For Each that loops through the Div tag and find the appropriate table(s). I then had to loop through the tables in order to find the checkboxes.
Some of your controls have controls. Your loop will ignore those controls. I have some extension methods I use to get all controls (you can specify type CheckBox so you don't need to do the type check in your calling code)
<Extension()> _
Public Function ChildControls(ByVal parent As Control) As List(Of Control)
Return ChildControls(Of Control)(parent)
End Function
<Extension()> _
Public Function ChildControls(Of T As Control)(ByVal parent As Control) As List(Of T)
Dim result As New ArrayList()
For Each ctrl As Control In parent.Controls
If TypeOf ctrl Is T Then result.Add(ctrl)
result.AddRange(ChildControls(Of T)(ctrl))
Next
Return result.ToArray().Select(Of T)(Function(arg1) CType(arg1, T)).ToList()
End Function
Well, I solved it as follows. (c#)
foreach (Control c in Page.Controls)
{
foreach (Control childc in c.Controls)
{
if (childc.ClientID == "menupadraolateral1")
{
foreach (Control cMnuLat in childc.Controls)
{
//here you can access the controls of usercontrol
}
}
}
}
Where "menupadraolateral1" is the ID used where the usercontrol is called
I hope I have helped