2009-07-14 4 views
7

나는 win form 어플리케이션의 통합 테스트를 이끌 기위한 작은 클래스를 작성 중이다. 테스트 드라이버 클래스는 기본 Form에 대한 액세스 권한을 가지며 이름에 의해 사용되어야하는 컨트롤을 찾고이를 사용하여 테스트를 수행합니다. 컨트롤을 찾으려면 Control.Controls 트리를 탐색합니다. 그러나 대화 상자 창 (대화 상자로 표시되는 사용자 지정 양식)에서 컨트롤을 가져 오려고 할 때 멈추게됩니다. 나는 그것을 어떻게 잡을 수 있습니까?현재 활성 모달 폼에 대한 참조를 얻으려면 어떻게해야합니까?

답변

20

정적 인 Form.ActiveForm 속성을 사용하여 현재 활성화 된 양식에 대한 참조를 얻을 수 있습니다.

편집 : Form에 포커스가없는 경우 Form.ActiveFormnull을 반환합니다. 이 문제를 해결 얻을
한 가지 방법은이 ShowDialog 사용하여 표시 할 때, 마녀 활성 FormApplication.OpenForms 수집을 사용하고 마지막 항목을 검색하는 것입니다 : 내가 틀렸다면

// using Linq: 
lastOpenedForm = Application.OpenForms.Cast<Form>().Last() 
// or (without Linq): 
lastOpenedForm = Application.OpenForms[Application.OpenForms.Count - 1] 
+0

내가하는 일이 무엇이든 null을 반환하는 것 같습니다. 어떤 아이디어? – Grzenio

+0

폼에 포커스가 없을 때 업데이트 됨 –

+0

Application.OpenForms works, cheers – Grzenio

0

미리 빌드 된 대화 상자의 컨트롤에 액세스 할 수 있는지 확실하지 않습니다. 그들은 모두 함께 포장 된 것처럼 보입니다. 행운을 빌어 자신이 원하는 것을하는 대화 상자를 만들 수 있습니다. 그런 다음 내부의 .Controls에 액세스 할 수 있습니다.

+0

예, 대화 상자로 표시되는 사용자 지정 양식을 사용하고 있습니다. – Grzenio

0

저를 수정, 그래도 가능하지 않은 경우 대화 상자 양식의 컨트롤에 액세스하려고 시도하는 것처럼 들립니다.

내 말은 ShowDialog은 양식이 만들어진 스레드를 "보류"하고 ShowDialog이 처리를 완료 할 때까지 응용 프로그램 (또는 테스트 클래스)에 제어를 반환하지 않습니다.이 경우 사용자 코드 그것의 경로에 계속할 것입니다.

별도의 스레드 (이 경우 표시 및 테스트해야하는 각 새 양식에 대해 별도의 스레드를 생성하도록 테스트 드라이버 클래스를 리팩터링)에서 컨트롤에 액세스하거나 조작하십시오.

+0

예, 새 스레드를 만들었으므로 차단되지 않았습니다. @Julien Poulin이 제공 한 답변을 찾고있었습니다 – Grzenio

+0

또한 부모 폼을 처리하는 경우 dispose 메서드는 활성 모달 폼에서도 실행됩니다. 가능한 경우 모달 형식에 액세스 할 수 있습니다. – mike100111

관련 문제