3

数値データの入力を処理する vb.net (2005) で作成したカスタム テキスト ボックス コンポーネント (system.windows.forms.textbox から継承) があります。それはうまくいきます。

番号が変更されていない場合、検証イベントと検証済みイベントの発生を抑制したいと思います。ユーザーがフォームをタブで移動し、テキスト ボックスからタブを移動すると、validating/validated イベントが発生します。

テキストボックスが値をキャッシュして、テキストプロパティにリストされているものと比較できると考えていました。それらが異なる場合は、検証/検証イベントを発生させたいと思います。それらが同じ場合、何も起動されません。

イベントを抑制する方法がわかりません。OnValidating イベントをオーバーライドしようとしました。それはうまくいきませんでした。

何か案は?

アップデート:

これがカスタム テキスト ボックス クラスです。アイデアは、validate イベントでテキスト ボックスの値をキャッシュしたいということです。値がキャッシュされると、次にユーザーがボックスをタブで移動したときに、検証イベントによって _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
4

2 に答える 2

3

TextChanged イベントでフラグを設定し、そのフラグを使用して、検証ハンドラーの先頭で終了するかどうかを指定できます。

于 2009-10-29T01:45:13.467 に答える
0

コントロールでイベントを処理し、以下のようにキャンセルしてみてください。

Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
    e.Cancel = True
End Sub
于 2009-10-28T20:14:20.550 に答える