如何在整个控件链中找到类型控件? [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在整个控件链中找到类型控件? [重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我想在我的表单中找到实现某个接口的所有控件(比方说ITestInterface)。我试过这个:

this.Controls.OfType<ITestInterface>();

但它只有一层深(尽管用MSDN写的 - @dasblinkenlight),所以如果例如,我在面板中有一个面板,面板内有一个ITestInterface控件,它就找不到了。

怎么做?


编辑:正如@HansPassant在评论中写道,我可以硬编码我的面板名称,但是,我需要一个通用的解决方案,而不是特定形式的特定解决方案。

答案

您必须使用递归并逐步执行控件的Controls属性:

private IEnumerable<T> GetAllOfType<T>(Control rootControl)
{
    return rootControl.Controls.OfType<T>().
           Concat(rootControl.Controls.OfType<Control>().SelectMany(GetAllOfType<T>));

}

你可以这样使用:

var allOfTestInterface = GetAllOfType<ITestInterface(this);

它接受根控件直接包含的所有控件(使用OfType<>()调用),然后再次为该控件包含的所有控件调用该方法,从而递归所有容器。 SelectMany将这个嵌套列表展平为一个列表。

以上是关于如何在整个控件链中找到类型控件? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Android 片段与复合控件

在整个应用程序中使用的通用 UI 控件[关闭]

如何在导航控件片段中关闭导航 DrawerLayout onBackPressed

Silverlight:在布局中查找所有类型的控件

MFC中TAB控件的编辑

创建多个扩展控件