PDA

View Full Version : [VB2010] - Evento Leave e GotFocus


lucausa75
19-11-2010, 11:46
Salve ragazzi,

dopo avere risolto il problema del refresh del DataSet e DataGridView ecco che me ne sorge un altro del quale adesso vi spiego.

Ho creato una maschera di inserimento dati all'interno della quale, ovviamente, si trovano delle caselle di testo.

Non appena modifico il valore di una ecco e sposto il fuoco da questa casella verso un altro controllo (gestisco il tutto sull'evento Leave della TextBox) mi viene visualizzato un messaggio informativo (vedi figura):

http://img202.imageshack.us/img202/65/45282982.th.png (http://img202.imageshack.us/i/45282982.png/)

Il problema è che voglio evitare questo messaggio se il fuoco si sposta sul bottone Aggiorna.

Ho fatto delle prove ma da quello che ho capito l'evento Leave della TextBox viene prima dell'evento GotFocus del bottone Aggiorna.

Mi basterebbe semplicemente capire se esiste un evento per capire qual'è il nome dell'oggetto verso il quale si è spostato il fuoco non appena un altro oggetto lo perde (in questo caso la mia TextBox, )... :confused:

Attendo consigli...

MarcoGG
19-11-2010, 14:06
OK. Una tecnica interessante potrebbe essere quella di raggruppare in un unico Metodo il check su quale controllo ha appena subito il Leave e quale ha appena ricevuto il Focus.

Come ? Semplice : se si interroga il Me.ActiveControl durante un evento Leave si scopre che di fatto lo stato attivo è già sul secondo controllo, anche se l'aggiornamento della UI avviene dopo.

Se ad esempio ho una Form che ha 2 TextBox e 1 Button :

Private Sub TextBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Leave
ctrlLeaveGotFocus(sender)
End Sub

Private Sub TextBox2_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.Leave
ctrlLeaveGotFocus(sender)
End Sub

Entrambi chiamano un Metodo che si può costruire secondo esigenza, e che nel mio caso è :

Private Sub ctrlLeaveGotFocus(ByVal ctrlL As Control)

Dim strLost As String
Dim strGot As String
If TypeOf ctrlL Is TextBox And TypeOf Me.ActiveControl Is TextBox Then

strLost = DirectCast(ctrlL, TextBox).Name
strGot = DirectCast(Me.ActiveControl, TextBox).Name

MsgBox(strLost & " ha perso il Focus." & vbCrLf & strGot & " ha ora il Focus.")

End If

End Sub

A questo punto :
1. Se il Focus passa da una delle TextBox all'altra mostra un warning.
2. Se il Focus passa da una delle TextBox al Button > nulla.
3. Se il Focus passa dal Button ad una delle TextBox > nulla.

;)

lucausa75
20-11-2010, 11:27
OK. Una tecnica interessante potrebbe essere quella di raggruppare in un unico Metodo il check su quale controllo ha appena subito il Leave e quale ha appena ricevuto il Focus.

Come ? Semplice : se si interroga il Me.ActiveControl durante un evento Leave si scopre che di fatto lo stato attivo è già sul secondo controllo, anche se l'aggiornamento della UI avviene dopo.

Se ad esempio ho una Form che ha 2 TextBox e 1 Button :

Private Sub TextBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Leave
ctrlLeaveGotFocus(sender)
End Sub

Private Sub TextBox2_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.Leave
ctrlLeaveGotFocus(sender)
End Sub

Entrambi chiamano un Metodo che si può costruire secondo esigenza, e che nel mio caso è :

Private Sub ctrlLeaveGotFocus(ByVal ctrlL As Control)

Dim strLost As String
Dim strGot As String
If TypeOf ctrlL Is TextBox And TypeOf Me.ActiveControl Is TextBox Then

strLost = DirectCast(ctrlL, TextBox).Name
strGot = DirectCast(Me.ActiveControl, TextBox).Name

MsgBox(strLost & " ha perso il Focus." & vbCrLf & strGot & " ha ora il Focus.")

End If

End Sub

A questo punto :
1. Se il Focus passa da una delle TextBox all'altra mostra un warning.
2. Se il Focus passa da una delle TextBox al Button > nulla.
3. Se il Focus passa dal Button ad una delle TextBox > nulla.

;)

Ottima la tua soluzione;
l'ho sfruttato estrapolando questa istruzione che funzione a meraviglia:

If Me.ActiveControl.Name = "btnOperazioneRecord2" Then
MsgBox("Il bottone aggiorna ha il focus")
Aggiornamento
Exit Sub
End If

Grazie :D