Impedisci l'attivazione dell'evento convalida / convalidato nella casella di testo personalizzata - vb.net

StackOverflow https://stackoverflow.com/questions/1639774

  •  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
È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top