2011-07-30 13 views
6

Ho un modulo Form1 dal quale visualizzo Form2 come modulo modale. Da Form2 eseguo tutti i tipi di modifica e cancellazione di diversi set di valori che dovrebbero essere riflessi in Form1 dopo la chiusura dello Form2. Quindi quello che faccio è RePopulateControls_in_Form1() dopo aver chiuso Form2. Poiché RePopulateControls_in_Form1() è un processo lungo, desidero eseguire tale metodo solo se alcune modifiche (modifica, aggiunta, eliminazione) avvengono in Form2 e non quando Form2 è appena aperto e chiuso.DialogResult che non chiude il modulo?

Quindi questo è quello che cerco di fare in Form1:

 Form2 f = new Form2(); 
     if (f.ShowDialog(this) == DialogResult.Something) 
      RePopulateControls_in_Form1() 

E poi nel Form2 che faccio,

private void bntEdit() 
    { 
     //If Edit? 
     this.DialogResult = DialogResult.Something; 
    } 
    private void bntAdd() 
    { 
     //If Add? 
     this.DialogResult = DialogResult.Something; 
    } 
    private void bntDelete() 
    { 
     //If Delete? 
     this.DialogResult = DialogResult.Something; 
    } 

Ma il mio problema è .Something. Se è diverso da .None, Form2 viene semplicemente chiuso. Non voglio che Form2 si chiuda semplicemente da solo, a meno che l'utente non lo chiuda.

Se faccio questo:

RePopulateControls_in_Form1() non è colpito!

In breve, nel mio programma come posso dire al compilatore di chiamare RePopulateControls_in_Form1() solo se i valori vengono modificati in Form2?

Nota: il ripopolamento è certamente necessario poiché i controlli sono creati dinamicamente e un po 'complessi (in realtà ciò che viene creato in Form2 sono i controlli della GUI e le sue etichette, ecc.).

risposta

10

Impostazione di DialogResult su Form nasconde il modulo e restituisce da ShowDialog. Se si desidera ritardare tale operazione fino a quando l'utente non esegue altre azioni (come la chiusura del modulo), è necessario memorizzare tale stato come campo membro e impostare DialogResult in un gestore per Form.Closing.

Inoltre, se si desidera chiudere il modulo modale su un pulsante, è possibile utilizzare la proprietà Button.DialogResult anziché effettuare un gestore Button.Click.

0

Vorrei utilizzare un evento nel modulo 2. Avviare quell'evento quando si chiude il Form2. Gestire quell'evento in Form1 ti consentirebbe di eseguire qualsiasi elaborazione tu voglia. Inoltre, se necessario, è possibile restituire alcune informazioni da Form2 a Form1 nei parametri dell'evento.

Un'alternativa sarebbe quella di impostare una variabile statica globale, forse solo un bool. Quindi Form2 può impostarlo su vero o falso a seconda se sono state apportate modifiche. Form1 può leggere questo quando Form2 restituisce e se true esegue l'elaborazione e lo imposta su false.

+0

OK Ottengo la prima parte, ma la seconda logica non è una tecnica di codifica corretta! – nawfal

+1

Perché no? Nel caso sopra userò un evento. Tuttavia, se esiste un valore che viene utilizzato in un'applicazione con 20 moduli e dieci volte quella in molte classi, come si garantisce che venga utilizzato un solo valore. Preferiresti passare il valore dalla forma alla forma e dalla classe alla classe tramite un parametro o proprietà del costruttore .... – ScruffyDuck

+0

Questo è qualcosa di semplice come impostare semplicemente un flag per far sapere a Form1 qualcosa su Form2.Perché una variabile globale che non è thread-safe? Capisco il significato di una variabile globale generale quando devi usarla su 220 classi come menzionato sopra. Ma qui, non solo, dovremmo evitare le variabili statiche, che dormono per l'intero ciclo di vita dell'applicazione, il più possibile, ma, cosa più importante, mi chiedo come potreste prevedere che il requisito menzionato nella domanda si riduca ad essere qualcosa come grande da essere impiegato in 220 classi dalla mia semplice domanda :) – nawfal

2

Un modo semplice potrebbe non essere utilizzare DialogResult, ma una proprietà dedicata che non interferisce con il comportamento del modulo. - Allora dovresti essere in grado di programmare qualsiasi logica tu voglia.

+0

Grazie. Questo è quello che ho fatto. – nawfal

+0

Ma mi sento @Ryan Russell ha una chiamata così bella ... Lasciami segno il suo – nawfal

Problemi correlati