Impedisci l'attivazione dell'evento convalida / convalidato nella casella di testo personalizzata - vb.net
-
08-07-2019 - |
Domanda
Ho un componente personalizzato per la casella di testo (eredita da system.windows.forms.textbox) che ho creato in vb.net (2005) che gestisce l'inserimento di dati numerici. Funziona bene.
Vorrei sopprimere l'attivazione degli eventi di convalida e convalida se il numero non è cambiato. Se un utente esegue la tabulazione attraverso il modulo e le schede dalla casella di testo, vengono generati gli eventi di convalida / convalida.
Stavo pensando che la casella di testo potesse memorizzare nella cache il valore e confrontarlo con ciò che è elencato nella proprietà text. Se sono diversi, vorrei che gli eventi di convalida / convalida vengano attivati. Se sono uguali, non viene sparato nulla.
Non riesco a capire come sopprimere l'evento. Ho provato a ignorare l'evento OnValidating. Non ha funzionato.
Qualche idea?
Aggiornamento:
Ecco la classe della casella di testo personalizzata. L'idea è che voglio memorizzare nella cache il valore della casella di testo sull'evento validate. Una volta memorizzato nella cache il valore, la volta successiva che l'utente passa in rassegna la casella, l'evento di convalida verificherà se _Cache è diverso da .Text. In tal caso, è quando desidero innalzare l'evento di convalida al modulo principale (nonché l'evento convalidato). Se _cache è lo stesso, non voglio sollevare l'evento nel modulo. In sostanza, la casella di testo funzionerà come una normale casella di testo, tranne per il fatto che il metodo di convalida e convalida viene sollevato nel modulo solo quando il testo è cambiato.
Public Class CustomTextBox
#Region "Class Level Variables"
Private _FirstClickCompleted As Boolean = False 'used to indicate that all of the text should be highlighted when the user box is clicked - only when the control has had focus shifted to it
Private _CachedValue As String = String.Empty
#End Region
#Region "Overridden methods"
Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
'check to see if the control has recently gained focus, if it has then allow the first click to highlight all of the text
If Not _FirstClickCompleted Then
Me.SelectAll() 'select all the text when the user clicks a mouse on it...
_FirstClickCompleted = True
End If
MyBase.OnClick(e)
End Sub
Protected Overrides Sub OnLostFocus(ByVal e As System.EventArgs)
_FirstClickCompleted = False 'reset the first click flag so that if the user clicks the control again the text will be highlighted
MyBase.OnLostFocus(e)
End Sub
Protected Overrides Sub OnValidating(ByVal e As System.ComponentModel.CancelEventArgs)
If String.Compare(_CachedValue, Me.Text) <> 0 Then
MyBase.OnValidating(e)
End If
End Sub
Protected Overrides Sub OnValidated(ByVal e As System.EventArgs)
_CachedValue = Me.Text
MyBase.OnValidated(e)
End Sub
#End Region
End Class
Aggiornamento 2:
Grazie a xpda, la soluzione è semplice (così semplice che non l'ho capito :)). Sostituisci OnValidating e OnValidated con (è richiesto anche un valore booleano per registrare lo stato):
Protected Overrides Sub OnValidating(ByVal e As System.ComponentModel.CancelEventArgs)
If String.Compare(_CachedValue, Me.Text) <> 0 Then
_ValidatingEventRaised = True
MyBase.OnValidating(e)
End If
End Sub
Protected Overrides Sub OnValidated(ByVal e As System.EventArgs)
If Not _ValidatingEventRaised Then Return
_CachedValue = Me.Text
_ValidatingEventRaised = False
MyBase.OnValidated(e)
End Sub
Soluzione
Puoi impostare un flag nell'evento TextChanged e usare quel flag per dire se uscire all'inizio dei gestori di validazione.
Altri suggerimenti
Prova a gestire l'evento sotto il tuo controllo e cancellalo come di seguito.
Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
e.Cancel = True
End Sub