Запретить валидацию / валидацию события в пользовательском текстовом поле - vb.net - PullRequest
3 голосов
/ 28 октября 2009

У меня есть пользовательский компонент текстового поля (унаследованный от 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

Ответы [ 2 ]

3 голосов
/ 29 октября 2009

Вы можете установить флаг в событии TextChanged и использовать этот флаг, чтобы указать, следует ли выйти в начале обработчиков проверки.

0 голосов
/ 28 октября 2009

Попробуйте обработать событие под вашим контролем и отмените его, как показано ниже.

Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
    e.Cancel = True
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...