Запретить запуск события Validating/Validated в пользовательском текстовом поле - vb.net

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

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top