Validate / Validatedイベントがカスタムテキストボックスで発生しないようにする-vb.net

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

  •  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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top