طيب الآن ما الخطوة التالية ؟
لاحظنا ان عملية اضافة احداث التحقق للمدخلات النصية والتعامل معها تتم بنفس الطريقة لمربعين النص تقريبا ، مع اختلاف شرط التحقق والرسالة التي تظهر للمستخدم ،
تخيل ان عندك 5 مربعات نصية للمدخلات ( اسم ورقم تليفون وبريد الكتروني وقيمة المرتب وتاريخ التسجيل) ، فان مطالب لكل مربع نص ان تضيف احداث validating و validated التي تقوم بنفس الشيء :
في البداية تتحقق من ان المدخل يوافق الشرط المعطى ، والا تلغي العملية وترسل رسالة خطأ ، واذا تم التحقق تكمل العملية وتمسح رسالة الخطأ
من غير المنطقي ان نكرر الكود كل مرة نضيف فيها مربع نص جديد ، انا شخصيا اكره تكرار الاكواد
ماذا اذا قمنا بتعريف اجراء عام لاي مربع نص يضيف هذه الاحداث ، ونخبره فقط بالشرط والرسالة ؟ فكره جيدة اليس كذلك ؟
الاجراء يأخذ ثلاث مدخلات :
الان كل ما علينا فعله لاضافة احداث تحقق لاي مربع نص هو كتابة سطر واحد في المشيد او في حدث اللود للفورم :
للتحقق من الاسم اكبر من حرفين :
للتحقق من البريد الالكتروني :
للتحقق من قيمة رقم عشري :
وهكذا كلما اردت اضافة مربع نص اضف له سطر التحقق
ويبقى استخدام ValidateChildren() كما هو ،
المثال بعد التعديل في المرفقات
لاحظنا ان عملية اضافة احداث التحقق للمدخلات النصية والتعامل معها تتم بنفس الطريقة لمربعين النص تقريبا ، مع اختلاف شرط التحقق والرسالة التي تظهر للمستخدم ،
تخيل ان عندك 5 مربعات نصية للمدخلات ( اسم ورقم تليفون وبريد الكتروني وقيمة المرتب وتاريخ التسجيل) ، فان مطالب لكل مربع نص ان تضيف احداث validating و validated التي تقوم بنفس الشيء :
في البداية تتحقق من ان المدخل يوافق الشرط المعطى ، والا تلغي العملية وترسل رسالة خطأ ، واذا تم التحقق تكمل العملية وتمسح رسالة الخطأ
كود :
Private Sub txtName_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles txtName.Validating
Dim txt = DirectCast(sender, TextBox)
If txt.Text.Trim().Length < 2 Then
e.Cancel = True
errorProvider1.SetError(txt, "الاسم لايمكن ان يكون اقل من حرفين")
End If
End Sub
Private Sub txtName_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles txtName.Validated
Dim txt = DirectCast(sender, TextBox)
errorProvider1.SetError(txt, "")
End Subمن غير المنطقي ان نكرر الكود كل مرة نضيف فيها مربع نص جديد ، انا شخصيا اكره تكرار الاكواد
ماذا اذا قمنا بتعريف اجراء عام لاي مربع نص يضيف هذه الاحداث ، ونخبره فقط بالشرط والرسالة ؟ فكره جيدة اليس كذلك ؟
كود :
Sub AddValidation(textBox As TextBox, validationChecker As Func(Of String, Boolean), errorMsg As String)
AddHandler textBox.Validating, Sub(s, e)
Dim txt = DirectCast(s, TextBox)
If Not validationChecker(txt.Text) Then
e.Cancel = True
errorProvider1.SetError(txt, errorMsg)
End If
End Sub
AddHandler textBox.Validated, Sub(s, e)
Dim txt = DirectCast(s, TextBox)
errorProvider1.SetError(txt, "")
End Sub
End Subالاجراء يأخذ ثلاث مدخلات :
- مربع النص المراد اضافة احداث التحقق له
- دالة تمثل الشرط الذي يتم بناء عليه التحقق ( دالة عادية مدخلها string وتخرج bool ، او تعبير لمدا )
- رسالة الخطأ التي ستظهر في حالة عدم صلاحية البيانات
الان كل ما علينا فعله لاضافة احداث تحقق لاي مربع نص هو كتابة سطر واحد في المشيد او في حدث اللود للفورم :
للتحقق من الاسم اكبر من حرفين :
كود :
AddValidation(txtName, Function(x) x.Trim().Length >= 2, "الاسم لايمكن ان يكون اقل من حرفين")للتحقق من البريد الالكتروني :
كود :
AddValidation(txtEmail, Function(x) Regex.IsMatch(x, "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$"), "صيغة بريد الكتروني غير صالحة")للتحقق من قيمة رقم عشري :
كود :
Dim d As Double
AddValidation(txtSalary, Function(x) Double.TryParse(x, d), "الرقم غير صالح")وهكذا كلما اردت اضافة مربع نص اضف له سطر التحقق
ويبقى استخدام ValidateChildren() كما هو ،
المثال بعد التعديل في المرفقات

