J'ai un composant de zone de texte personnalisé (hérite de system.windows.forms.textbox) que j'ai créé dans vb.net (2005) qui gère l'entrée de données numériques. Ça marche bien.Empêcher l'événement Validation/Validation de déclencher dans la zone de texte personnalisée - vb.net
Je souhaite supprimer les événements de validation et de validation du tir si le nombre n'a pas changé. Si un utilisateur parcourt le formulaire et les onglets à partir de la zone de texte, les événements de validation/validation sont déclenchés.
Je pensais que la zone de texte pouvait mettre en cache la valeur et la comparer à ce qui est listé dans la propriété text. Si elles sont différentes, alors je voudrais que les événements de validation/validation se déclenchent. Si elles sont identiques, rien n'est tiré.
Je n'arrive pas à comprendre comment supprimer l'événement. J'ai essayé de surcharger l'événement OnValidating. Cela n'a pas fonctionné.
Des idées?
Mise à jour:
Voici la zone de texte personnalisé classe. L'idée est que je veux mettre en cache la valeur de la zone de texte sur l'événement validate. Une fois la valeur mise en cache, la prochaine fois que l'utilisateur parcourt la zone, l'événement de validation vérifie si _Cache est différent du .Text. Si tel est le cas, j'aimerais que l'événement de validation soit porté au formulaire parent (ainsi qu'à l'événement validé). Si le _cache est le même, alors je ne veux pas élever l'événement au formulaire. Essentiellement, la zone de texte fonctionnera de la même manière qu'une zone de texte normale, sauf que la méthode de validation et la méthode validée ne sont augmentées que lorsque le texte a été modifié.
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
Mise à jour 2:
Merci à xpda, la solution est simple (si simple que je ne comprenais pas :)). Remplacer OnValidating et OnValidated avec (également un booléen pour enregistrer l'état est nécessaire):
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
Je n'ai pas compris ce que tu voulais dire au début mais maintenant je pense que je l'ai et c'est si simple. Merci! – Bluebill