2009-07-14 1 views
7

Sto scrivendo una piccola classe per guidare il test di integrazione di un'applicazione per moduli di vincita. La classe di test driver ha accesso al modulo principale e controlla il controllo che deve essere utilizzato per nome e lo utilizza per guidare il test. Per trovare il controllo sto attraversando l'albero Control.Controls. Tuttavia, rimango bloccato quando voglio arrivare ai controlli in una finestra di dialogo (un modulo personalizzato mostrato come una finestra di dialogo). Come posso ottenerlo?Come posso ottenere il riferimento al modulo modale attualmente attivo?

risposta

20

È possibile ottenere un riferimento al modulo attualmente attivo utilizzando la proprietà statica Form.ActiveForm.

Modifica: Se lo Form.ActiveFormForm.ActiveForm restituisce null.
Un modo per aggirare il problema è quello di utilizzare la collezione Application.OpenForms e recuperare l'elemento ultima, strega sarà attivo Form quando viene visualizzato utilizzando ShowDialog:

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

Sembra restituire nulla qualunque cosa io faccia. Qualche idea? – Grzenio

+0

Risposta aggiornata quando nessun modulo ha lo stato attivo –

+0

Application.OpenForms funziona, applausi – Grzenio

0

Non sono sicuro di poter accedere ai controlli su una finestra di dialogo predefinita; sembrano tutti imballati insieme. Potresti avere più fortuna nel creare una finestra di dialogo personalizzata che faccia ciò che vuoi che faccia. Quindi puoi accedere a .Controls al suo interno.

+0

Sì, sto usando i moduli personalizzati che sono mostrati come una finestra di dialogo – Grzenio

0

mi corregga se sbaglio, tuttavia, sembra che tu stia tentando di accedere ai controlli sul modulo di dialogo quando non è del tutto possibile.

Ciò che intendo è che, ShowDialog "terrà" il thread su cui è stato creato il modulo e non restituirà il controllo all'applicazione (o alla classe di test) fino al termine dell'elaborazione del ShowDialog, nel qual caso il codice utente continuerebbe sul suo percorso.

Provare ad accedere o manipolare i controlli da un thread separato (in questo caso, refactoring la classe del driver di test per generare un thread separato per ogni nuovo modulo che deve essere visualizzato e testato).

+0

Sì, ho creato un nuovo thread, quindi non è bloccato. Stavo cercando la risposta fornita da @ Julien Poulin – Grzenio

+0

Inoltre, se disponi il modulo principale, il metodo dispose verrà eseguito anche con un modulo modale attivo. È possibile che tu voglia accedere al modulo modale. – mike100111