Fermare la creazione di una form

martedì 08 aprile 2008 - 13.27

biyorl Profilo | Newbie

Salve a tutti
Domanda breve: Come posso fermare la creazione di una form nel constructor di questa?
Non mi serve nell'evento load.
Ho provato a lanciare una exception non gestita, e si, non mi crea la form, ma mi viene fuori la finestra brutta dell'exception che, fra l'altro vorrei cambiare per una normale perché dovrei informare come mai no si è creata la form....

Grazie a tutti!

0v3rCl0ck Profilo | Guru

Ciao,

Ci sono diversi modi per fare quella cosa. Potresti lanciare un eccezione (magari un ApplicationException o una tua Exception personalizzata) e poi recuperarla con un try catch intorno alla definizione del nuovo oggetto (new FormDaBloccare). Oppure puoi utilizzare la proprietà DialogResult della form da bloccare, e impostarla per esempio a DialogResult.Abort, subito dopo chiamare la Close() e nel codice che apre la form, subito dopo il New, controllare che la proprietà DialogResult sia a 'OK', altrimenti lanciare il messaggio di errore. Anche se dopo la Close(), il form lancia la Dispose(), la proprietà DialogResult, rimane accessibile, quindi non dovresti avere problemi. Se il metodo precedente dovesse dare problemi, puoi passare alla finestra da aprire il riferimento di una proprietà della form chiamante, ad esempio una stringa, che se contiene un messaggio subito dopo la new, vuol dire che la form che si voleva aprire, ha generato un errore.

Spero di esserti stato utile

- Michael -
http://blogs.dotnethell.it/Regulator/

0v3rCl0ck Profilo | Guru

Ti ho fatto un piccolo progettino di esempio, ovviamente ci sono davvero tanti modi per fare la stessa cosa. In quell'esempio ci sono 3 modi diversi.


Enjoy It
- Michael -
http://blogs.dotnethell.it/Regulator/

biyorl Profilo | Newbie

Innanzitutto tante grazie Michael, sei molto gentile!!
Il mio problema è che non ho formulato la domanda completa, shame on me!, ma la tua risposta è perfetta per come l'ho formulata (ancora grazie).
Comunque la mia situazione è questa:
Ho tante forms con un'ancestore comune. Mi piacerebbe poter controllare la creazione di ogni form scrivendo SOLO nel ancestore e non su ogni singola form, ma non so se si può fare (es. scrivendo il codice necessario nel constructor dell'ancestore).
Per complicare le cose, per far il test di creazione ho bisogno del nome della form che sto per creare.
Dunque, per farla breve, si può controllare la creazione di una form dall'ancestore di questa? si possono passare parametri al constructor dell'ancestore (tipo il nome della form)?

ah, tante scuse per le migliaia di volte che ho scritto le parole "ancestore" e "creazione" in così poche righe di testo :P.

Grazie ancora!

0v3rCl0ck Profilo | Guru

>Innanzitutto tante grazie Michael, sei molto gentile!!
>Il mio problema è che non ho formulato la domanda completa, shame
>on me!, ma la tua risposta è perfetta per come l'ho formulata
>(ancora grazie).
>Comunque la mia situazione è questa:
>Ho tante forms con un'ancestore comune. Mi piacerebbe poter controllare
>la creazione di ogni form scrivendo SOLO nel ancestore e non
>su ogni singola form, ma non so se si può fare (es. scrivendo
>il codice necessario nel constructor dell'ancestore).

Per sapere se la form da aprire ha generato un errore, ed eventualmente sapere di che errore si tratta, devi per forza scrivere del codice per ogni form. Se poi la gestione degli errori è pressoche identica per ogni form, potresti crearti una ClasseBase che eredità da System.Windows.Forms, generare un costruttore base, ed ereditare la classe base in tutte le form da aprire.

>Per complicare le cose, per far il test di creazione ho bisogno
>del nome della form che sto per creare.

Forse quello che cerchi è NomeForm.Name ?

>Dunque, per farla breve, si può controllare la creazione di una
>form dall'ancestore di questa? si possono passare parametri al
>constructor dell'ancestore (tipo il nome della form)?

Sicuramente ad un costruttore è possibile passare parametri. Vedi l'esempio che ho mandato prima, vedi il frmToBlock3.

>
>ah, tante scuse per le migliaia di volte che ho scritto le parole
>"ancestore" e "creazione" in così poche righe di testo :P.
>
>Grazie ancora!
>

Prego

- Michael -
http://blogs.dotnethell.it/Regulator/

biyorl Profilo | Newbie

Grazien Michael, ho risolto come dici te!
Dalla clase ancestore faccio il test ( passando il nome della form che sto creando dal costruttore con il
public frm(): base("nomeForm")
).
Poi se il test non va bene, lancio una exception (throw new Exception()) generica sempre nel ancestore, che gestisco con un try-catch lì dove creo/mostro la form, e così posso mostrare il messaggio che voglio.

Ancora grazie della soluzione Michael!!






0v3rCl0ck Profilo | Guru

>Grazien Michael, ho risolto come dici te!
>Dalla clase ancestore faccio il test ( passando il nome della
>form che sto creando dal costruttore con il
>public frm(): base("nomeForm") ).

Bene, hai capito perfettamente il concetto. Un'ottima soluzione pulita.

>Poi se il test non va bene, lancio una exception (throw new Exception())
>generica sempre nel ancestore, che gestisco con un try-catch
>lì dove creo/mostro la form, e così posso mostrare il messaggio
>che voglio.
>
>Ancora grazie della soluzione Michael!!

Prego

- Michael -
http://blogs.dotnethell.it/Regulator/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5