如何在整个控件链中找到类型控件? [重复]
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
将这个嵌套列表展平为一个列表。
以上是关于如何在整个控件链中找到类型控件? [重复]的主要内容,如果未能解决你的问题,请参考以下文章