Подтвердить что ты не робот

Получить список элементов управления Child внутри группового ящика

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

В этом документе будет дано четкое представление о жилье органов управления.

enter image description here

foreach (Control control in grpBxTargetSensitivity.Controls)
            {
                if (control is FlowLayoutPanel && control.HasChildren)
                {
                    foreach (Control ctrl in control.Controls)
                    {
                        if (ctrl is Panel && ctrl.HasChildren)
                        {
                            foreach (Control tbox in ctrl.Controls)
                            {
                                if (tbox is TextBox)
                                {
                                    TextBox textbox = tbox as TextBox;
                                    validData &= !string.IsNullOrWhiteSpace(textbox.Text);
                                }
                            }
                        }
                    }
                }
            }

Мой вопрос: есть ли лучший способ (возможно, через LINQ) получить все элементы управления, включая текстовые поля, размещенные внутри панелей, чем вышеупомянутый метод.?

4b9b3361

Ответ 1

Я не знаю, что это лучше. Легче читать, это вопрос мнения:

var validData
    = grpBxTargetSensitivity.Controls.OfType<FlowLayoutPanel>()
                            .SelectMany(c => c.Controls.OfType<Panel>())
                            .SelectMany(c => c.Controls.OfType<TextBox>())
                            .All(textbox => !string.IsNullOrWhiteSpace(textbox.Text));

Это захватит все текстовые поля внутри всех панелей во всех FlowLayoutPanels в GroupBox и вернет true, если все те TextBoxes имеют в них значение.

Ответ 2

Один слот оболочки,

IEnumerable<TextBox> collection = grpBxTargetSensitivity.Children.OfType<TextBox>(); //assuming you are looking for TextBox

или

Вы можете попробовать выполнить общий метод,

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
            {
                yield return (T)child;
            }

            foreach (T childOfChild in FindVisualChildren<T>(child))
            {
                yield return childOfChild;
            }
        }
    }
}

затем перечислите элементы управления следующим образом:

foreach (TextBox tb in FindVisualChildren<TextBox>(grpBxTargetSensitivity)) //assuming you are looking for TextBox
{
    // do something
}

Ответ 3

Я создаю один метод, благодаря возможности найти для вас любые элементы управления (или тип T) и любой унаследованный объект из элемента управления (или тип T):

public static List<T> GetSubControlsOf<T>(Control parent) where T : Control
{
       var myCtrls = new List<T>();

       foreach (Control ctrl in parent.Controls)
       {
           // if ctrl is type of T
           if (ctrl.GetType() == typeof(T) || 
               ctrl.GetType().IsInstanceOfType(typeof(T)))  
           {
                myCtrls.Add(ctrl as T);
           }
           else if (ctrl.HasChildren)
           {
                var childs = GetSubControlsOf<T>(ctrl);    
                if (childs.Any()) 
                   myCtrls.AddRange(childs);
           }
       }

       return myCtrls;
 }

и используйте эту форму для:

foreach (var textbox in GetSubControlsOf<TextBox>(this))
{
       validData &= !string.IsNullOrWhiteSpace(textbox.Text);
}