2017-12-18 6 views
-1

특정 인터페이스 (예 : ITestInterface)를 구현하는 양식의 모든 컨트롤을 찾고 싶습니다. 나는이 시도 :전체 컨트롤 체인에서 유형 컨트롤을 찾는 방법은 무엇입니까?

this.Controls.OfType<ITestInterface>(); 

을하지만 (MSDN에 기록 된 것을에도 불구하고 - @dasblinkenlight) 깊은 하나 개 수준의 GOE 예를 들어, 나는 형태의 패널과 패널 내부 ITestInterface 제어 할 수 있습니다 그래서 만약 , 그것을 찾지 못할 것이다.

어떻게 수행하나요?


편집 : @HansPassant 코멘트에 쓴, 나는 하드 코드 내 패널의 이름은, 그러나, 나는 일반적인 솔루션, 그리고 특정 형태로 특정 솔루션을 필요로 할 수있다.

+1

힌트 : 재귀를 사용하십시오. (Control.Controls/Control.Parent) –

+0

this.Controls 대신 panel1.Control을 고려하십시오. –

+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 그렇습니다. 표현은 다소 모호합니다. 중첩 된 컨트롤이 포함되어 있다고하지는 않지만, 컨트롤을 사용하여 중첩 된 컨트롤을 포함한 모든 컨트롤을 반복 할 수 있다고 말합니다. 동일;) –

관련 문제