Newsgroup: it.comp.lang.visual-basic
Titolo: Scavalcare un evento vb.net

Ciao,
nella mia app creata con Visual Studio 2010, su chiusura della maschera principale (Home) ho inserito un messaggio:
 
Private Sub Home_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
 
        If (MessageBox.Show("Sto per chiudere l'applicazione!" & vbNewLine & vbNewLine _
                             & "Confermi?", "   CHIUSURA APPLICAZIONE", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = 
Windows.Forms.DialogResult.No
) Then
            e.Cancel = True
            MessageBox.Show("Chiusura applicazione interrotta...", "CHIUSURA APPLICAZIONE", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Else
 
        End If
 
End Sub
 
In un caso avrei bisogno di non scatenare l'evento form closing, è possibile?
 
Ho una 2° maschera nella quale cliccando un pulsante voglio far chiudere l'app ma ovviamente la chiusura della form Home mi fa partire la MsgBox.
 
Ho provato così:
 
Private Sub btnAggiorna_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAggiorna.Click
 
            RemoveHandler Home.FormClosing, AddressOf btnAggiorna_Click
 
            Application.Close()
End Sub
 
il messaggio inserito in Home.FormClosing compare comunque
 
soluzioni?
grazie
Marco

Per interrompere l'innesco di un evento devi sganciarlo dalla/e funzione/i che fino ad ora lo hanno consumato.
 
Quando chiamo RemoveHandler, devi passare quindi l'indirizzo del delegato giusto; nel tuo codice stai passando 'btnAggiorna_Click' che non centra nulla, non è il delegato di quell'evento... la funzione che ti interessa è 'Home_FormClosing'
 
Quindi, o rendi qulla sub pubblica, in modo che tu possa referenziarla nel codice della seconda maschera, oppure (più pulito) crei nella prima maschera un metodo pubblico 'SpegniWarning' o come ti pare, dove inserisce i remove handler del caso
 
Esempio
 
'Maschera1
Public Sub SpegniWarning()
    RemoveHandler Me.FormClosing, AddressOf Home_FormClosing 
End Sub
 
'Maschera2
Private Sub btnAggiorna_Click (...) Handles btnAggiorna.Click
            Home.SpegniWarning
            Application.Close()
End Sub
 
 
Nota che tutta questa cosa può diventare superflua se sfrutti il parametro 'e' di FormClosing, che trovi descritto su
https://msdn.microsoft.com/it-it/library/system.windows.forms.formclosingeventargs(v=vs.110).aspx
 
 
Private Sub Home_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
 
	If e.CloseReason = CloseReason.UserClosing Then
		If (MessageBox.Show("Sto per chiudere l'applicazione!" & vbNewLine & vbNewLine _
									& "Confermi?", "   CHIUSURA APPLICAZIONE", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = 
Windows.Forms.DialogResult.No
) Then
			e.Cancel = True
			MessageBox.Show("Chiusura applicazione interrotta...", "CHIUSURA APPLICAZIONE", MessageBoxButtons.OK, MessageBoxIcon.Information)
		Else
 
		End If
	End If
 
End Sub
 
La IF che vedi all'inizio fa si che il messaggio venga mostrato se l'utente prova a chiudere manualmente con il classico tasto X, ma non se invece la chiusura è pilotata via codice in qualche altro modo, come ad esempio la tua seconda maschera


Ottimo, era ciò che mi serviva!!!
grazie 1000
Marco