获取GroupBox内部子控件列表

17

我的应用程序中有一个包含子控件的GroupBox(如附图所示)。我想要通过简单的foreach循环枚举所有的文本框,以执行一些验证。

此文档大纲将给出这些控件的组织结构的公正想法。

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)来获取所有容器内部的文本框等控件而不是上述方法?

4个回答

20

我不知道这样是否更好...易读性则是个人观点问题:

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

这将获取trueGroupBox中所有FlowLayoutPanels中的所有Panel内的所有TextBox,如果所有这些TextBox都包含值,则返回true


1
太棒了!非常感谢。在LINQ中,我能否在上述查询中添加条件来过滤一些文本框? - this-Me

5
一种简洁的解决方案,
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
}

4
我为您创建了一种方法,可以找到任何控件(或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);
}

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接