I prefer to handle such recursive manipulations with extension methods.
Use examples:
this.ApplyToControls<TextBox>(tbx => tbx.Clear());
var tbxs = this.GetAllControlsOfType<TextBox>();
tbxs.ApplyToControlCollection<TextBox>(tbx => tbx.Clear());
tbxs.ApplyToControlCollection<TextBox>(tbx => tbx.Text = "default");
Code:
public static class ControlExtensions
{
public static IEnumerable<T> GetAllControlsOfType<T>(this Control cntrl)
where T : Control
{
var stack = new Stack<Control>(cntrl.Controls.Cast<Control>());
while (stack.Any())
{
Control nextControl = stack.Pop();
if (nextControl.HasChildren)
{
foreach (Control childControl in nextControl.Controls)
{
stack.Push(childControl);
}
}
if(nextControl is T) yield return nextControl as T;
}
}
public static void ApplyToControlCollection<T>(this IEnumerable<T> instances, Action<T> action)
{
foreach (T instance in instances)
{
action(instance);
}
}
public static void ApplyToControls<T>(this Control cntrl, Action<T> action)
{
foreach (T cinstance in cntrl.Controls.OfType<T>())
{
action(cinstance);
}
if (cntrl.HasChildren)
{
foreach (Control childcntrl in cntrl.Controls)
{
ApplyToControls<T>(childcntrl, action);
}
}
}
}