CloseReason

giovedì 31 gennaio 2008 - 15.07

Teech Profilo | Expert

In un Form ho questo genere di codice

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Quando premo la X per chiudere il form, il controllo attivo è tb e tb.Text è 'Prova', prima di chiudere il FormBase mi apre il FormDialog: vorrei che in caso di chiusura non mi aprisse FormDialog.
Ho verificato nelle Espressioni di Controllo (mettendo un Break Point all'interno della Sub tb_Validated) che quando premo X in FormBase ho una proprietà read only CloseReason inizializzata con il dato che mi interessa... Il problema è che non riesco ad accedere a questa proprietà...
Guardando MSDN ho visto quanto segue:
CloseReason è una proprietà di System.Windows.Forms.FormClosingEventArgs che ha la seguente gerarchia di ereditarietà

System.Object
System.EventArgs
System.ComponentModel.CancelEventArgs
System.Windows.Forms.FormClosingEventArgs

Nell'evento da me utilizzato ho a disposizione un oggetto System.EventArgs (e As System.EventArgs)... Come posso accedere alla proprietà CauseReason? Perchè riesco a vederla fra le espressioni di controllo ma non riesco ad accedervi neanche in lettura?
Forse è una cosa semplice ma ci stò perdendo la ragione!!!

Grazie mille!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

aiedail92 Profilo | Expert

Ciao

come dice MSDN, CloseReason è una proprietà di FormClosingEventArgs, che è il tipo del parametro e passato alla gestione dell'evento FormClosing. Quindi è impossibile ottenere la proprietà CloseReason dal parametro e dell'evento Validated che è di tipo EventArgs (da cui deriva FormClosingEventArgs)

Poichè l'evento Validated della tua TextBox si verifica prima dell'evento FormClosing della Form, non puoi eseguire nell'evento Validated il controllo se il Form sta per essere chiuso. Facendo delle prove sono riuscito a risolvere il tuo problema con un timer: invece che mostrare direttamente la form all'evento Validated, ho impostato un timer in modo che venga fatto partire all'evento validated. In questo modo nell'intervallo di tempo in cui il timer si sta "caricando", il form ha il tempo di chiudersi senza visualizzare il FormDialog:

private void tb_Validated(object sender, EventArgs e) { if (tb.Text == "Prova") { //Faccio partire il timer. //Se hai cliccato il pulsante di chiusura //viene generato automaticamente l'evento FormClosing //e l'applicazione si chiude ignorando il timer timer1.Start(); } } private void timer1_Tick(object sender, EventArgs e) { //Fermo il timer in modo da non mostrare più volte la form timer1.Stop(); //Inizializzo la form e la visualizzo Form fm = new Form(); fm.ShowDialog(); }

Luca

Teech Profilo | Expert

Sono d'accordo però faccio le seguenti considerazioni, forse sbagliate:

- All'evento Velidated viene passato un oggetto System.EventArg... La proprietà CloseReason è della classe FormClosingEventArgs che comunque deriva da System,EventArg... Attraverso dei Cast più o meno impliciti, non posso raggiungere la mia proprietà?

- Lanciando in Debug la mia applicazione, sull'evento Validated della textbox controllando l'oggetto Me vedo la proprietà CloseReason correttamente inizializzata... Come è possibile che non ci sia modo di andarla a leggere?

Per queste considerazioni che stò insistendo tanto per risolvere il "problema" nel modo pensato inizialmente...
E' più per capire la corretta logica di programmazione che per risolvere un problema immediato... (lo risolverò disabilitando la X, e mettendo un pulsante di chiusura dove disabilito la cuasevalidation dei controlli)

Grazie dell'aiuto!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

aiedail92 Profilo | Expert

Ciao

Provando a fare il cast ottieni un'eccezione InvalidCastException col seguente messaggio: "Impossibile eseguire il cast di oggetti di tipo 'System.EventArgs' sul tipo 'System.Windows.Forms.FormClosingEventArgs'."

Comunque, anche se fossi riuscito ad eseguire il cast, non avresti ottenuto alcun vantaggio perchè al momento in cui viene lanciato l'evento Validated del controllo, il programma ancora "non sa" che deve chiudersi, nè tantomeno puoi scoprirlo da una variabile che non contiene informazioni sulla chiusura.

Quanto al fatto di vedere la proprietà CloseReason in debug correttamente inizializzata, credo che quello che tu vedi non sia la proprietà, ma l'enumerazione stessa. Infatti non esiste la proprietà CloseReason della classe Form, mentre CloseReason (che è il tipo della proprietà CloseReason della classe FormClosingEventArgs) è una delle enumerazioni del namespace Forms

Luca

Teech Profilo | Expert

Scusami se insisto, ma allego un pdf dove si vede che la proprietà CloseReason dell'oggeto Me. è valorizzata a 3 (UserClosing) nell'evento Validate del TextBox...
Ho semplicemente premuto la X per chiudere il form ed ho riportato il codice indicato sopra...
Se passo su un altro controllo questa proprietà viene valorizzata a 0...

Inserendo semplicemente
If Me.CloseReason<>CloseReason.UserClosing Then 'Codice per aprire la FormDialog End If
potrebbe risolvere la mia situazione...

E' che vorrei capire il perchè non riesco a "leggerla" da codice questa proprietà che effettivamente esiste ed è correttamente valorizzata già nel momento in cui servirebbe a me...

Grazie e scusatemi se sono pedante
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

aiedail92 Profilo | Expert

Ciao

In effetti da Visual Basic la proprietà è visibile (avendo lavorato in C# prima non me ne ero accorto); ma, come forse ti sei accorto anche tu dall'icona affianco, la proprietà ha modificatore Private (si vede dal lucchetto in basso a sinistra), e quindi è visibile solo dalla classe di appartenenza, e non dalla tua Form derivata

Luca

Teech Profilo | Expert

Giuro che ero convinto che significasse che la proprietà era Read Only...
Cattiva notizia per me ma mille mila grazie di avermi sopportato e aiutato...
Potendo, a buon rendere
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

aiedail92 Profilo | Expert

Figurati... Anzi, grazie a te: qui non si finisce mai di imparare

Luca
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5