Как получить ВСЕ дочерние элементы управления формы Windows Forms определенного типа (кнопка / текстовое поле)? - PullRequest
107 голосов
/ 06 августа 2010

Мне нужно получить все элементы управления в форме типа x. Я почти уверен, что когда-то видел этот код, который использовал что-то вроде этого:

dim ctrls() as Control
ctrls = Me.Controls(GetType(TextBox))

Я знаю, что могу перебрать все элементы управления, получая детей с помощью рекурсивной функции, но Есть ли что-то более простое или более простое, например, следующее?

Dim Ctrls = From ctrl In Me.Controls Where ctrl.GetType Is Textbox

Ответы [ 23 ]

0 голосов
/ 06 августа 2010

Это может работать:

Public Function getControls(Of T)() As List(Of T)
    Dim st As New Stack(Of Control)
    Dim ctl As Control
    Dim li As New List(Of T)

    st.Push(Me)

    While st.Count > 0
        ctl = st.Pop
        For Each c In ctl.Controls
            st.Push(CType(c, Control))
            If c.GetType Is GetType(T) Then
                li.Add(CType(c, T))
            End If
        Next
    End While

    Return li
End Function

Я думаю, что функция получения всех элементов управления, о которых вы говорите, доступна только для WPF .

0 голосов
/ 28 января 2014

Вот проверенное и работающее универсальное решение:

У меня есть большое количество элементов управления UpDownNumeric, некоторые в основной форме, некоторые в групповых полях внутри формы. Я хочу, чтобы только один последний выбранный элемент управления изменил задний цвет на зеленый, для которого я сначала установил все остальные на белый, используя этот метод: (также можно расширить до внуков)

    public void setAllUpDnBackColorWhite()
    {
        //To set the numericUpDown background color of the selected control to white: 
        //and then the last selected control will change to green.

        foreach (Control cont in this.Controls)
        {
           if (cont.HasChildren)
            {
                foreach (Control contChild in cont.Controls)
                    if (contChild.GetType() == typeof(NumericUpDown))
                        contChild.BackColor = Color.White;
            }
            if (cont.GetType() == typeof(NumericUpDown))
                cont.BackColor = Color.White;
       }
    }   
0 голосов
/ 09 апреля 2012

Я модифицировал из @PsychoCoder. Теперь можно найти все элементы управления (включая вложенные).

public static IEnumerable<T> GetChildrens<T>(Control control)
{
  var type = typeof (T);

  var allControls = GetAllChildrens(control);

  return allControls.Where(c => c.GetType() == type).Cast<T>();
}

private static IEnumerable<Control> GetAllChildrens(Control control)
{
  var controls = control.Controls.Cast<Control>();
  return controls.SelectMany(c => GetAllChildrens(c))
    .Concat(controls);
}
...