2017-12-18 302 views
-1

我想找到我的表单中实现某个接口的所有控件(比如说ITestInterface)。我曾经尝试这样做:如何在整个控件链中找到类型的控件?

this.Controls.OfType<ITestInterface>(); 

但专家组只有一个深深的(尽管你是怎样MSDN - @dasblinkenlight)的水平,所以,如果例如,我在形式的面板和面板内的ITestInterface控制,它不会找到它。

如何做到这一点?


编辑:作为@HansPassant在评论中写道,我可以硬编码我的名字的面板,但是,我需要一个通用的解决方案,而不是一个具体的解决方案,以一种特殊形式。

+1

提示:使用递归。 (Control.Controls/Control.Parent) –

+0

考虑panel1.Controls而不是this.Controls –

+0

@HansPassant - 我需要的解决方案是通用的,而不是特定于特定的表单。 – Sipo

回答

2

你必须使用递归并通过您的控件的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%的相同;) –