Если нам нужно найти контрол на форме, зная его имя, то все решается довольно просто — у массива контролов 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. | Персональный блог Толика Панкова