I need to loop through all the controls in my asp.net webpage and do something to the control. In one instance I\'m making a giant string out of the page and emailing it to
foreach (Control ctlMaster in Page.Controls)
{
if (ctlMaster is MasterPage)
{
foreach (Control ctlForm in ctlMaster.Controls)
{
if (ctlForm is HtmlForm)
{
foreach (Control ctlContent in ctlForm.Controls)
{
if (ctlContent is ContentPlaceHolder)
{
foreach (Control ctlChild in ctlContent.Controls)
{
//Do something!
}
}
}
}
}
}
}
This should do it. Though you might need to do some checking to make sure you're actually dealing with the correct ContentPlaceHolder if there's more than one.
I rather like David Finleys linq approach to FindControl http://weblogs.asp.net/dfindley/archive/2007/06/29/linq-the-uber-findcontrol.aspx
public static class PageExtensions
{
public static IEnumerable<Control> All(this ControlCollection controls)
{
foreach (Control control in controls)
{
foreach (Control grandChild in control.Controls.All())
yield return grandChild;
yield return control;
}
}
}
Usage:
// get the first empty textbox
TextBox firstEmpty = accountDetails.Controls
.All()
.OfType<TextBox>()
.Where(tb => tb.Text.Trim().Length == 0)
.FirstOrDefault();
// and focus it
if (firstEmpty != null)
firstEmpty.Focus();
This worked for me ..
Just make sure you ID all your controls starting with the prefixes shown below. ie: <asp:TextBox ID="TextBoxEmail"...>
for example. Otherwise the parser will not detect your control. If someone has a better way of parsing without knowing / hard-coding the ID of the controls, that would be even sweeter.
protected String GetControls(Control control)
{
//Get text from form elements
String text = "";
foreach (Control ctrl in control.Controls)
{
if (ctrl.ClientID.Contains("TextBox"))
{
TextBox tb = (TextBox)ctrl;
text += tb.ID.Replace("TextBox", "") + ": " + tb.Text + "<br />";
}
if (ctrl.ClientID.Contains("RadioButtonList"))
{
RadioButtonList rbl = (RadioButtonList)ctrl;
text += rbl.ID.Replace("RadioButtonList", "") + ": " + rbl.SelectedItem.Text + "<br />";
}
if (ctrl.ClientID.Contains("DropDownList"))
{
DropDownList ddl = (DropDownList)ctrl;
text += ddl.ID.Replace("DropDownList", "") + ": " + ddl.SelectedItem.Text + "<br />";
}
if (ctrl.ClientID.Contains("CheckBox"))
{
CheckBox cb1 = (CheckBox)ctrl;
text += cb1.ID.Replace("CheckBox", "") + ": " + cb1.Text + "<br />";
}
if (ctrl.HasControls())
text += GetControls(ctrl);
}
return text;
}
And to call it, passing Page object ...
String log;
foreach (Control ctrl in Page.Controls)
log += GetControls(ctrl);
sub getcontrols(byref c as control, byref allControls as list(of control)
if c isnot nothing
allcontrols.add(c)
if c.controls.count>0 then
for each ctrl as control in c.controls
getcontrols(ctrl,allcontrols)
next
end if
Please find the below code. This should help you with all the controls you need. You should be able to use Web Page Controls, as well as ASP.NET Controls.
public partial class Default : System.Web.UI.Page
{
List<Control> lstControl = new List<Control>();
protected void Page_Load(object sender, EventArgs e)
{
}
private List<Label> getLabels() // Add all Lables to a list
{
List<Label> lLabels = new List<Label>();
foreach (Control oControl in Page.Controls)
{
GetAllControlsInWebPage(oControl);
}
foreach (Control oControl in lstControl)
{
if (oControl.GetType() == typeof(Label))
{
lLabels.Add((Label)oControl);
}
}
return lLabels;
}
protected void GetAllControlsInWebPage(Control oControl)
{
foreach (Control childControl in oControl.Controls)
{
lstControl.Add(childControl); //lstControl - Global variable
if (childControl.HasControls())
GetAllControlsInWebPage(childControl);
}
}
}
Your original method will not work if you start from the root element of your document: something like page.Controls as you will only loop through the first level of controls, but remember a control can be composite. So you need recursion to pull that off.
public void FindTheControls(List<Control> foundSofar, Control parent)
{
foreach(var c in parent.Controls)
{
if(c is IControl) //Or whatever that is you checking for
{
foundSofar.Add(c);
if(c.Controls.Count > 0)
{
this.FindTheControls(foundSofar, c);
}
}
}
}