Reputation:
I'm trying to loop through all the controls on a sharepoint page, for the purposes of testing i just want to output the control ID
this is the code i'm using
Public Shared Sub SubstituteValues3(ByVal CurrentPage As Page, ByRef s As StringBuilder)
'Page()
'- MasterPage
'- HtmlForm
'- ContentPlaceHolder
'- The TextBoxes, etc.
For Each ctlMaster As Control In CurrentPage.Controls
If TypeOf ctlMaster Is MasterPage Then
HttpContext.Current.Response.Output.Write("Master Page <br/>")
For Each ctlForm As Control In ctlMaster.Controls
If TypeOf ctlForm Is HtmlForm Then
HttpContext.Current.Response.Output.Write("HTML Form <br/>")
For Each ctlContent As Control In ctlForm.Controls
If TypeOf ctlContent Is ContentPlaceHolder Then
HttpContext.Current.Response.Output.Write("Content Placeholder <br/>")
For Each ctlChild As Control In ctlContent.Controls
HttpContext.Current.Response.Output.Write(ctlChild.ID.ToString & "<br />")
Next
End If
Next
End If
Next
End If
Next
HttpContext.Current.Response.Output.Write("--------------")
HttpContext.Current.Response.End()
however it's not getting past the 'MasterPage' output.
I would expect to see the names of all the controls i have inside my content placeholder but i find it all a bit confusing.
Upvotes: 0
Views: 4098
Reputation: 34687
you can do this simply with recursion, not efficent, but it is simple... try this method: public void getControls(Control input)
{
foreach (Control c in input.Controls)
{
Response.Write(c.GetType().ToString() + " - " + c.ID + "<br />");
getControls(c);
}
}
And call it like this:
getControls(Page);
That will cycle trough all controls on your page and output the type - ID of them and print it out to the top of the page... you could also use the code to construct a list or whatever you want to do.
Upvotes: 0
Reputation:
i found this piece of code which seems list the controls I need, i think it's more of a hack though.
For i = 0 To CurrentPage.Request.Form.AllKeys.Length - 1
If CurrentPage.Request.Form.GetKey(i).Contains("ctl00$PlaceHolderMain$") Then
Dim key As String = CurrentPage.Request.Form.GetKey(i).Substring(22)
Dim keyText As String = String.Format("[{0}]", key)
HttpContext.Current.Response.Output.Write(keyText & "<br/>")
'Text.Replace(keyText, CurrentPage.Request.Form("ctl00$PlaceHolderMain$" & key))
End If
Next
Upvotes: 0
Reputation: 268
Start with Page.Master.Controls
From there what you have should basically work
For Each ctlForm As Control In Page.Master.Controls
If TypeOf ctlForm Is HtmlForm Then
HttpContext.Current.Response.Output.Write("HTML Form <br/>")
For Each ctlContent As Control In ctlForm.Controls
If TypeOf ctlContent Is ContentPlaceHolder Then
HttpContext.Current.Response.Output.Write("Content Placeholder <br/>")
For Each ctlChild As Control In ctlContent.Controls
HttpContext.Current.Response.Output.Write(ctlChild.ID.ToString & "<br />")
Next
End If
Next
End If
Next
Upvotes: 1
Reputation: 25099
A MasterPage isn't a control of the current page, it's a property of it, in Page.MasterPage
Upvotes: 0