winforms
Mostrare un modulo
Ricerca…
introduzione
Questo argomento spiega come funziona il motore WinForms per visualizzare i moduli e il modo in cui si controlla la loro durata.
Mostra una forma modale o modale
Dopo aver definito la struttura del modulo con il designer WinForms, è possibile visualizzare i moduli in codice con due metodi diversi.
Metodo: una forma non modale
Form1 aForm1Instance = new Form1(); aForm1Instance.Show();
Metodo: una finestra di dialogo modale
Form2 aForm2Instance = new Form2(); aForm2Instance.ShowDialog();
I due metodi hanno una distinzione molto importante. Il primo metodo (quello non modale) mostra il tuo modulo e quindi ritorna immediatamente senza attendere la chiusura del modulo appena aperto. Quindi il tuo codice continua con quello che segue la chiamata Show. Il secondo metodo invece (quello modale) apre il modulo e blocca qualsiasi attività sull'intera applicazione fino a quando non si chiude il modulo tramite il pulsante di chiusura o con alcuni pulsanti opportunamente configurati per chiudere il modulo
Chiusura di un modulo non modale
Viene utilizzato un modulo non modale (di solito) quando è necessario mostrare qualcosa in modo permanente accanto alla schermata principale dell'applicazione (si pensi a una legenda o una vista su un flusso di dati proveniente in modo asincrono da un dispositivo o una finestra secondaria MDI).
Ma una forma non modale pone una sfida unica quando vuoi chiuderla. Come recuperare l'istanza e chiamare il metodo Close in quell'istanza?
È possibile mantenere una variabile globale che fa riferimento all'istanza che si desidera chiudere.
theGlobalInstance.Close();
theGlobalInstance.Dispose();
theGlobalInstance = null;
Ma possiamo anche scegliere di utilizzare la raccolta Application.OpenForms in cui il modulo modulo memorizza tutte le istanze del modulo create e ancora aperte.
È possibile recuperare questa particolare istanza da questa raccolta e chiamare il metodo Close
Form2 toClose = Application.OpenForms.OfType<Form2>().FirstOrDefault();
if(toClose != null)
{
toClose.Close();
toClose.Dispose();
}
Chiusura di una forma modale
Quando un modulo viene mostrato utilizzando il metodo ShowDialog
, è necessario impostare la proprietà DialogResult
del DialogResult
per chiudere il modulo. Questa proprietà può essere impostata utilizzando l' enumerazione chiamata anche DialogResult .
Per chiudere un modulo, è sufficiente impostare la proprietà DialogResult
del DialogResult
(su qualsiasi valore in DialogResult.None
) in un gestore di eventi. Quando il tuo codice esce dal gestore di eventi, il motore WinForm nasconde il modulo e il codice che segue la chiamata del metodo ShowDialog
iniziale continuerà l'esecuzione.
private cmdClose_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
Il codice chiamante può acquisire il valore restituito da ShowDialog per determinare quale pulsante l'utente ha fatto clic nel modulo. Quando viene visualizzato utilizzando ShowDialog()
, il modulo non viene eliminato automaticamente (poiché era semplicemente nascosto e non chiuso), quindi è importante utilizzare un blocco using
per assicurarsi che il modulo sia stato eliminato.
Di seguito è riportato un esempio di controllo del risultato dell'utilizzo di OpenFileDialog
incorporato, controllo del risultato e accesso a una proprietà dalla finestra di dialogo prima di eliminarlo.
using (var form = new OpenFileDialog())
{
DialogResult result = form.ShowDialog();
if (result == DialogResult.OK)
{
MessageBox.Show("Selected file is: " + form.FileName);
}
}
È inoltre possibile impostare la proprietà DialogResult
su un pulsante. Facendo clic su questo pulsante si imposta la proprietà DialogResult
sul modulo sul valore associato al pulsante. Ciò consente di chiudere il modulo senza aggiungere un gestore di eventi per impostare DialogResult
nel codice.
Ad esempio, se si aggiunge un pulsante OK al modulo e si imposta la proprietà su DialogResult.OK
il modulo si chiude automaticamente quando si preme quel pulsante e il codice chiamante riceve un DialogResult.OK
in risposta alla chiamata del metodo ShowDialog()
.