Запретить запуск события Validating/Validated в пользовательском текстовом поле - vb.net
-
08-07-2019 - |
Вопрос
У меня есть собственный компонент текстового поля (наследуется от system.windows.forms.textbox), который я создал в vb.net (2005), который обрабатывает ввод числовых данных.Это работает хорошо.
Я хотел бы запретить запуск событий проверки и проверки, если число не изменилось.Если пользователь просматривает форму и вкладки в текстовом поле, запускаются события проверки/проверки.
Я думал, что текстовое поле может кэшировать значение и сравнивать его с тем, что указано в текстовом свойстве.Если они разные, то я бы хотел, чтобы события проверки/проверки сработали.Если они одинаковы, ничего не запускается.
Я не могу понять, как подавить это событие.Я попытался переопределить событие OnValidating.Это не сработало.
Есть идеи?
Обновлять:
Вот класс пользовательского текстового поля.Идея состоит в том, что я хочу кэшировать значение текстового поля в событии проверки.Как только значение будет кэшировано, в следующий раз, когда пользователь просматривает поле, событие проверки проверит, отличается ли _Cache от .Text.Если да, то именно тогда я хотел бы перенести событие проверки в родительскую форму (а также проверенное событие).Если _cache тот же, то я не хочу передавать событие в форму.По сути, текстовое поле будет работать так же, как обычное текстовое поле, за исключением того, что метод проверки и проверки вызывается в форме только тогда, когда текст изменился.
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
Обновление 2:
Благодаря xpda решение простое (настолько простое, что я не понял :) ).Замените OnValidating и OnValidated на (также требуется логическое значение для записи состояния):
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
Решение
Вы можете установить флаг в событии TextChanged и использовать этот флаг, чтобы указать, следует ли завершать работу в начале обработчиков проверки.
Другие советы
Попробуйте обработать событие, находящееся под вашим контролем, и отмените его, как показано ниже.
Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
e.Cancel = True
End Sub