منع التحقق من صحة / التحقق من صحة الحدث من كرة صاروخية نص مخصص - vb.net
-
08-07-2019 - |
سؤال
ولدي عنصر مربع نص مخصص (يرث من system.windows.forms.textbox) بأنني خلقت في vb.net (2005) الذي يعالج إدخال بيانات رقمية. أنه يعمل بشكل جيد.
وأود أن قمع التأكد من صحتها والتحقق من صحة الأحداث من اطلاق إذا كان الرقم لم يتغير. إذا كان المستخدم الجدولة من خلال شكل وعلامات التبويب من مربع النص، والتحقق من صحة / وتطلق الأحداث التحقق من صحتها.
وكنت أفكر أن مربع النص يمكن مؤقتا قيمة وذلك لمقارنة ما تم سرده في خاصية النص. إذا كانت مختلفة، ثم أود أن ترغب في التحقق من صحة / التحقق من صحة الأحداث لاطلاق النار. إذا كانت هي نفسها، وأطلق شيء.
وأنا لا يمكن أن يبدو لمعرفة كيفية قمع هذا الحدث. لقد حاولت تجاوز الحدث 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