获取组框内的子控件列表

时间:2015-05-18 04:42:30

标签: c# linq

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

本文件大纲将对控制的住房提供一个合理的概念

enter image description here

<tr ng-repeat="row in layers | filter:isActive | orderBy:row.name">
    <td><input type="radio" id="{{ 'layerOption-' + row.key }}" name="layerOptions" ng-checked="row.checked" /></td>
    <td>{{ row.name }}</td>
    <td></td>
</tr>

我的问题是,是否有更好的方法(可能通过LINQ)获得所有控件,包括容纳在面板内的文本框而不是上述方法。

4 个答案:

答案 0 :(得分:16)

我不知道这更好......是否更容易阅读是一个意见问题:

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

这将获取GroupBox中所有FlowLayoutPanel中所有Panel内的所有TextBox,如果所有这些TextBox中都有值,则返回true

答案 1 :(得分:4)

单衬里洗脱,

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
}

答案 2 :(得分:3)

我创建了一个方法,能够为你找到任何文本框(或T类型)和Textbox(或T类型)中的任何继承对象:

$(document).ready(function () {
$('table').find('a').click(function () {
    var original = parseInt($(this).parents('tr').find('td:nth-child(4)').text()) + 5;

    $(this).parents('tr').find('input[type=text]').val(original);

   });

});

并将此表格用于例如:

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

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

                if (childs.Any()) myCtrls.AddRange(childs);
           }
       }

       return myCtrls;
 }

答案 3 :(得分:2)

我在StackOverflow本身找到了以下链接:

How to get ALL child controls of a Windows Forms form of a specific type (Button/Textbox)?

Loop through all the user controls on a page

给他们试试。应该适合你的情况。