仅返回容器中特定类型的控件

问题描述 投票:0回答:1

我使用这样的方法来返回容器中的所有控件:

public static IEnumerable<Control> NestedControls(this Control container, bool search_all_children = true)
{
    var stack = new Stack<Control>();
    stack.Push(container);
    do
    {
        var control = stack.Pop();

        foreach (Control child in control.Controls)
        {
            yield return child;
            stack.Push(child);
        }
    }
    while (stack.Count > 0 && search_all_children);
}

这样我就可以获得所有控件:

var textboxes = panel1.NestedControls().OfType<TextBox>().ToList();

但是,在方法中添加了额外的代码片段,我无法仅获取容器中某种类型的控件。我应该如何更新像下面这样的代码的方法?

var textboxes = panel1.NestedControls(TextBox);
c# winforms controls childcontrol
1个回答
0
投票

您可以非常轻松地将此方法更改为通用方法,以仅返回特定类型的子级:

public static IEnumerable<T> NestedControls<T>(this Control container, bool search_all_children = true) where T : Control
{
    var stack = new Stack<Control>();
    stack.Push(container);
    do
    {
        var control = stack.Pop();

        foreach (Control child in control.Controls)
        {
            // Admittedly, not the best choice of name here...
            if(child is T childToReturn)
            {
                yield return childToReturn;
            }
            stack.Push(child);
        }
    }
    while (stack.Count > 0 && search_all_children);
}

用途:

var textboxes = panel1.NestedControls<TextBox>();
var allNestedControls = panel1.NestedControls<Control>();

您还可以非常轻松地添加非泛型重载以返回所有嵌套控件,而无需指定 Control:

public static IEnumerable<Control> NestedControls(this Control container, bool search_all_children = true) 
   => NestedControls<Control>(container, search_all_children);
© www.soinside.com 2019 - 2024. All rights reserved.