Validate / Validatedイベントがカスタムテキストボックスで発生しないようにする-vb.net
-
08-07-2019 - |
質問
数値データの入力を処理するvb.net(2005)で作成したカスタムテキストボックスコンポーネント(system.windows.forms.textboxから継承)があります。うまくいきます。
数値が変更されていない場合、検証イベントと検証イベントが発生しないようにします。ユーザーがフォームとタブをテキストボックスからタブで移動している場合、検証/検証イベントが発生します。
テキストボックスが値をキャッシュして、テキストプロパティにリストされている値と比較できると考えていました。それらが異なる場合、検証/検証イベントを起動する必要があります。それらが同じ場合、何も発生しません。
イベントを抑制する方法がわかりません。 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