В данной статье я хочу показать начинающим разработчикам очень полезный метод для получения всех контролов интересующего нас типа в данном родительском контроле.
Похожие примеры: Поиск (получение) дочернего контрола в родительском на c#, Поиск вложенного контрола во внешнем - обобщенный метод c#
Собственно, к примеру имеется Windows Forms – форма, на которой присутствует множество различного типа дочерних контролов (TextBox, MaskedTextBox, DateTimePicker, Button, Lable, DataGridView и многие другие).
Допустим, мы хотим получить все элементы типа MaskedTextBox.
Для этого определим метод поиска контролов по типу.
void GetAllTypedControls(
Control ctrl, List<Control> controls, Type type)
{
// Работаем только с элементами искомого типа
if (ctrl.GetType() == type)
{
controls.Add(ctrl);
}
// Проходим через элементы рекурсивно,
// чтобы не пропустить элементы,
//которые находятся в контейнерах
foreach (Control ctrlChild in ctrl.Controls)
{
GetAllTypedControls(ctrlChild, controls, type);
}
}
Обратите внимание, что данный метод универсальный поскольку ищет дочерние контролы любых типов, которые ему в качестве входного параметра передадим.
Наш метод принимает три параметра: Control ctrl (контрол, в котором производится поиск), List<Control> controls (список контролов, куда будут помещаться найденные дочерние контролы), Type type (тип искомых контролов).
А вот код вызова данного метода и последующего использования найденных контролов:
List<Control> allmaskedbox = new List<Control>();
GetAllTypedControls(
this, allmaskedbox, typeof(MaskedTextBox));
foreach (MaskedTextBox mtb in allmaskedbox)
{
mtb.BackColor = SystemColors.Info;
mtb.Click += new EventHandler(MaskedTextBox_Click);
mtb.Leave += new EventHandler(MaskedTextBox_Leave);
}
Здесь, мы предварительно создали пустой список искомых контролов, затем наполнили его посредством вызова метода GetAllTypedControls, а потом пробегаясь по списку данного списка установили цвет фона каждому MaskedTextBox и подписались на события Click и Leave.
Таким образом мы обнаружили все MaskedTextBox на нашей форме (передали то мы ссылку на форму ключевым словом this. Естественно, для поиска в любом другом контроле передавать придется ссылку на сам контрол, а не this).
Вот так все просто и очень удобно.
В одной из следующих статьях я покажу как создать подобный метод используя обобщения.