2010-06-02 24 views
5

Ho un'applicazione per i moduli Windows C#. Il modo in cui attualmente lo ho impostato, quando viene eseguito Form1_Load(), controlla i dati non salvati recuperati e, se trova alcuni, richiede all'utente se vuole aprire quei dati. Quando il programma è in esecuzione, funziona bene ma la finestra di messaggio viene visualizzata subito e il modulo principale del programma (Form1) non viene visualizzato fino a quando l'utente non fa clic su Sì o No. Vorrei prima che compaia Form1 e poi il prompt del messaggio.Qual è il modo migliore per chiamare correttamente un metodo DOPO il caricamento di un modulo?

Ora per ovviare a questo problema prima di aver creato un timer nel mio modulo, ho avviato il timer nel metodo Form1_Load(), quindi ho eseguito il controllo e il prompt utente nel primo evento di spunta timer. Questa tecnica risolve il problema ma sembra che potrebbe esserci un modo migliore.

Avete qualche idea migliore?

Edit: Penso di aver usato anche uno sfondo per fare qualcosa di simile. Sembra un po 'scemo affrontare tutti i problemi di invocare il metodo per tornare al thread del form e tutta quella schifezza solo per ritardarla di un paio di millisecondi!

+0

tag non appropriati. dovresti scegliere "C#" "winforms". i tag dovrebbero significare categoria di domande. – Andrey

+0

Sì, non ero sicuro di cosa usare. L'ho risolto ora. Grazie. – PICyourBrain

+1

Per riferimento futuro, questo collegamento contiene un elenco dell'ordine degli eventi durante la visualizzazione di un modulo: http://msdn.microsoft.com/en-us/library/86faxx0d%28VS.80%29.aspx –

risposta

13

vorrei utilizzare Form1_Shown()

+1

Fantastico. Non mi ero neanche reso conto che esistesse l'evento Form_Shown. Posso dire che sarà una buona giornata! – PICyourBrain

+0

Non credo che stia suggerendo l'evento. Penso che stia puntando a scavalcare il metodo OnShown()? – Ian

+0

Eventi o override. Eventi, se non stai cambiando comportamento. Override, se lo sei. Nel contesto della domanda, vorrei scavalcare. – AMissico

2
  • Utilizzando un Windows.Forms.Timer è una buona, stabile, ben noto, e di facile comprensione tecnica per fare quello che vuoi. Eviterei qualsiasi altro oggetto timer.

  • L'evento Shown del modulo funziona correttamente.

  • Sovraccarico/annullamento del metodo Show. (La mia tecnica preferita per un maggiore controllo.) In questo metodo, farei il controllo necessario. Una volta pronto, chiamerei il metodo base.Show, quindi eseguirò qualsiasi altra elaborazione, come finestre di messaggio, prompt, registrazione o altro.

+0

-1? Ehi, non è giusto. Ero nel mezzo della modifica. Non può un "post" di un ragazzo al fine di "pseudo-salvare"? – AMissico

+2

Dato che l'OP ha esplicitamente detto che vuole che qualcosa accada subito dopo la visualizzazione del modulo sullo schermo, non è possibile * ottenere * più appropriato di form.Shown(). Un Timer è molto goffo per questo: se il tempo non è perfetto (e potrebbe cambiare su macchine diverse), il messaggio potrebbe apparire nel mezzo di un'altra azione dell'utente. E se hai intenzione di usare comunque gli eventi, perché usare Show invece di Shown? – Klay

+0

Mi piace prendere il controllo. Viene mostrato dopo. Show è prima.Show mi dà la possibilità di mostrare una forma, un messaggio, un prompt o altro. Mostrato è troppo tardi. Il carico è troppo presto. – AMissico

5

utilizzare l'evento Shown. Sembra adatto a ciò che ti serve e verrà visualizzato solo la prima volta che viene mostrato il modulo.

Form f1 = new Form(); 
f1.Shown += new EventHandler(f1_Shown); 

public void f1_Shown(object sender, EventArgs e) 
{ 
    // Show dialog in here 
} 
+0

Questo è davvero conveniente! Grazie per aver condiviso – Kryptic

+0

Sto cercando di utilizzare la tua soluzione, sembra che la GUI sia attiva ma non esegue il rendering del controller finché non termina le attività sull'evento Mostrato. Qualche consiglio per me? –

Problemi correlati