如何在整个控件链中找到类型的控件?
问题描述:
我想找到我的表单中实现某个接口的所有控件(比如说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
将此嵌套列表展平成一个列表。
+1
@dasblinkenlight是的,措辞相当模糊,他们并不真正说包含嵌套控件,他们说你可以使用'Controls'来“遍历表单的所有控件,包括嵌套控件”,这不是100%的相同;) –
提示:使用递归。 (Control.Controls/Control.Parent) –
考虑panel1.Controls而不是this.Controls –
@HansPassant - 我需要的解决方案是通用的,而不是特定于特定的表单。 – Sipo