Я на самом деле написал несколько методов расширения для работы именно для этого:
public static class MyExensions ()
{
public static Control FindControlRecursively (this Control control, string name)
{
Control result = null;
if (control.ID.Equals (name))
{
result = control;
}
else
{
foreach (var child in control.Children)
{
result = child.FindControlRecursively (name);
if (result != null)
{
break;
}
}
}
return result;
}
public static T FindControlRecursively<T> (this Control control, string name)
where T: Control
{
return control.FindControlRecursively (name) as T;
}
}
Примечание: Нулевые проверки удалены для простоты.
Выможно использовать, чтобы найти, скажем, TextBox
в вашей форме следующим образом:
public class MyForm : Form
{
public void SetSomeText ()
{
var control = this.FindControlRecursively<TextBox> ("myTextboxName");
if (control != null)
{
control.Text = "I found it!";
}
// Or...
var control2 = this.FindControlRecursively ("myTextboxName2") as TextBox;
if (control != null)
{
control2.Text = "I found this one, also!";
}
}
}
Редактировать
Конечно, это глубина -Первый алгоритм , который может быть медленным в зависимости от глубины цепочки управления.Вы можете переписать его, используя алгоритм в ширину *, если видите, что он слишком медленный.