Если нам нужно найти контрол на форме, зная его имя, то все решается довольно просто — у массива контролов Controls есть метод Find, который найдет нам что нужно, если указать правильное имя контрола:
private Control FindControl(string ControlName, Form form)
{
Control ctrl = null;
Control[] buf = form.Controls.Find(ControlName, true);
if (buf.Length == 0) return null;
if (buf.Length > 1) return null;
ctrl = buf[0];
return ctrl;
}
Вот тут уже сложнее, особенно с переключателями. Они обычно сидят на форме в контейнерах, например в GroupBox'ах, и функция Find тут не поможет. Необходим другой подход, если мы хотим получить список контролов определенного типа. А именно — надо сделать рекурсивную функцию поиска. Кто боится рекурсии и связанных с ней переполнений, скажу, что ничего страшного нет.
Мне удалось уронить студию на 5 000 однотипных компонентов, а подобное число компонентов вряд ли может быть в реальности, только если вы не радиокнопочный маньяк 🙂
Функция такая вот:
private ListFindAllRadiobuttons(Control.ControlCollection collection) { List result = new List (); foreach (Control ctrl in collection) { if (ctrl.HasChildren) { result.AddRange(this.FindAllRadiobuttons(ctrl.Controls)); } if (ctrl is RadioButton) { result.Add((RadioButton)ctrl); } } return result; }
Т.е. если мы просто наткнулись на переключатель, при переборе контролов из массива Controls, то добавляем переключатель в массив, если же, мы наткнулись на контрол-контейнер (ctrl.HasChildren == true), то вызываем функцию перебора массива уже для массива Controls контейнера.
Pingback: C#, WindowsForms. Автоматическая выгрузка и загрузка содержимого контролов на форме. В объект или запись DataSet. | Персональный блог Толика Панкова