C#, WindowsForms - найти все переключатели (RadioButtons) на форме.
Если нам нужно найти контрол на форме, зная его имя, то все решается довольно просто - у массива контролов
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 List FindAllRadiobuttons(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
контейнера.Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2018/06/28/c-wi