I have a Web content form and need to access a control inside the content panel. I know of two ways to access the control:
TextBox txt = (TextBox)Page.Co
The issue is that FindControl() does not traverse certain control children such as a templated control. If the control you are after lives in a template, it won't be found.
So we added the following extension methods to deal with this. If you are not using 3.5 or want to avoid the extension methods, you could make a general purpose library out of these.
You can now get the control you are after by coding:
var button = Page.GetControl("MyButton") as Button;
The extension methods do the recursive work for you. Hope this helps!
public static IEnumerable Flatten(this ControlCollection controls)
{
List list = new List();
controls.Traverse(c => list.Add(c));
return list;
}
public static IEnumerable Flatten(this ControlCollection controls,
Func predicate)
{
List list = new List();
controls.Traverse(c => { if (predicate(c)) list.Add(c); });
return list;
}
public static void Traverse(this ControlCollection controls, Action action)
{
foreach (Control control in controls)
{
action(control);
if (control.HasControls())
{
control.Controls.Traverse(action);
}
}
}
public static Control GetControl(this Control control, string id)
{
return control.Controls.Flatten(c => c.ID == id).SingleOrDefault();
}
public static IEnumerable GetControls(this Control control)
{
return control.Controls.Flatten();
}