2009-10-28 5 views
3

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 

Répondre

3

Vous pouvez définir un indicateur en cas TextChanged et d'utiliser ce drapeau pour dire si pour quitter au début des gestionnaires de validation.

+0

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

0

Essayez de gérer l'événement dans votre contrôle et l'annuler comme ci-dessous.

Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating 
    e.Cancel = True 
End Sub 
+0

Oups. Désolé, n'a pas remarqué que vous avez déjà essayé de remplacer l'événement OnValidating. – DevByDefault

+0

Le problème avec l'utilisation de e.cancel = true est qu'il indique que la méthode de validation a échoué. Cela n'empêche pas l'événement d'être déclenché dans le formulaire principal. – Bluebill

Questions connexes