2009-10-28 1 views
3

У меня есть пользовательский компонент текстового поля (наследуется от system.windows.forms.textbox), который я создал в vb.net (2005), который обрабатывает ввод числовые данные. Это работает хорошо.Предотвращение проверки/проверки событий при запуске в пользовательском текстовом поле - vb.net

Я хотел был бы подавить проверенные и подтвержденные события от стрельбы, если число не изменилось. Если пользователь вводит табуляцию через форму и вкладки из текстового поля, активируются проверенные/проверенные события.

Я думал, что текстовое поле может кэшировать значение и сравнивать его с тем, что указано в свойстве text. Если они отличаются друг от друга, я бы хотел, чтобы события проверки/проверки выполнялись. Если они одинаковы, ничто не увольняется.

Я не могу понять, как подавить событие. Я попытался переопределить событие OnValidating. Это не сработало.

Любые идеи?

Update:

Вот пользовательский класс текстовое поле. Идея заключается в том, что я хочу кэшировать значение текстового поля в событии проверки. После того, как значение кэшируется, в следующий раз, когда пользователь введет флажок, проверяющее событие проверит, не отличается ли _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 

Update 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 

ответ

3

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

+0

Я не понимал, что вы имели в виду, но теперь я думаю, что у меня есть это, и это так просто. Благодаря! – Bluebill

0

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

Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating 
    e.Cancel = True 
End Sub 
+0

К сожалению. извините, не заметил, что вы уже пытались переопределить событие OnValidating. – DevByDefault

+0

Проблема с использованием e.cancel = true заключается в том, что он указывает, что метод проверки не сработал. Это не мешает событию подняться в основной форме. – Bluebill