数値データの入力を処理する 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