У меня есть пользовательский компонент текстового поля (унаследованный от system.windows.forms.textbox), который я создал в vb.net (2005), который обрабатывает ввод числовых данных. Хорошо работает.
Я бы хотел запретить валидацию и валидацию событий, если число не изменилось. Если пользователь вкладывает форму и вкладки из текстового поля, события проверки / проверки запускаются.
Я думал, что текстовое поле может кэшировать значение и сравнивать его с тем, что указано в свойстве text. Если они отличаются, то я бы хотел, чтобы события проверки / подтверждения запускались. Если они одинаковые, ничего не происходит.
Я не могу понять, как подавить событие. Я попытался переопределить событие 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