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
È possibile ottenere un riferimento al modulo attualmente attivo utilizzando la proprietà statica Form.ActiveForm
.
Modifica: Se lo Form.ActiveForm
Form.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]
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.
Sì, sto usando i moduli personalizzati che sono mostrati come una finestra di dialogo – Grzenio
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).
Sì, ho creato un nuovo thread, quindi non è bloccato. Stavo cercando la risposta fornita da @ Julien Poulin – Grzenio
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
Sembra restituire nulla qualunque cosa io faccia. Qualche idea? – Grzenio
Risposta aggiornata quando nessun modulo ha lo stato attivo –
Application.OpenForms funziona, applausi – Grzenio