2017-12-18 301 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%的相同;) –