23-08-20, 12:52 AM
(آخر تعديل لهذه المشاركة : 23-08-20, 10:16 AM {2} بواسطة Anas Mahmoud.)
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته اعضاء المنتدى الكرام
المقال بلغة C#
من المعروف ان غالبية البرامج تتعامل مع مدخلات نصية من المستخدم Textbox ،
ولكن المستخدم غير مضمون ، وبالتالي تضطر لاختبار المدخلات في كل مرة تريد تنفيذ شيء ما بناء عليها حتى لا يحصل exception اثناء تشغيل البرنامج ، وبالطبع عليك تتبع مدخلات المستخدم طوال الوقت ، وقد يحدث ان تنسى مربع نص بدون تتبع مدخلاته فينهار كل شيء
ماذا لو كان هناك طريقة فعالة لتحديد المدخلات المسموح بها لكل مربع نص مرة واحدة فقط ويتكفل البرنامج بالعراك مع المستخدم بدلا منك ؟
هناك بالفعل ما يسمى بالتحقق او Validation للادوات ، بحيث تكتب الكود الخاص التحقق من المدخل للاداه مرة واحدة فقط ، فتصبح الاداة منيعة ضد مدخلات المستخدم الغير متوقعة ، وما تشمله عملية التحقق من اظهار رسالة خطا او ما شابه.
مقادير الطبخة:
قبل ان نبدأ نحتاج ان تصنع مشروعا جديدا للتجربة ،
ومن ثم تضيف له :
الآن اصبح كل شيء جاهز لكتابة الكود
أساس عملية التحقق هما الحدثان Validating و Validated
الحدث Validating: ينطلق عندما تبدأ عملية التحقق ويحدث ذلك عندما تفقد الاداه التركيز Focus عادة ، ويمكنك داخله اضافة الكود الخاص بالتحقق من المدخل اذا كان صالحا ام لا كما يلي :
وسيطة الحدث فيها خاصية e.Cancel من نوع bool ، اذا تم قمنا باسنادها ب true فاننا نخبر الحدث بان هذا المدخل غير صالح ، ويبقي على وضع تركيز الاداه
وبذلك يمكننا التأكد من صلاحية البيانات وفي حالة كانت غير صالة نقوم بجعل e.Cancel=true ونظهر رسالة خطأ مثلا ، والذي سيحدث بعد ذلك انه في كل مرة تحتاج الاداة للحقق من المدخل ستنظهر الى e.Cancel وبالتالي ستحدد ماعيها فعله،
في برنامجنا الصغير قم باضافة الحدث txtName.Validating من قائمة الاحداث ،
الان نريد ان نمنع المستخدم من ادخال قيمة اسم اقل من حرفين ، نضيف الكود التالي :
الان شغل المشروع وحاول ان تكتب قيمة اصغر من حرفين وغادر الاداه ، تلاحظ ظهور خطأ يخبرك بانه عليك ادخال اسم اكبر من حرفين
حسنا صديقي نحن الان في منتصف الطريق تقريبا
جرب ان تكتب قيمة اكبر من حرفين وانتقل الى المربع التالي ، نلاحظ انه ينتقل بدون مشاكل ولكن لم يتم ازالة الخطأ
وهنا يأتي دور الحدث Validated
الحدث Validated:
يتم اطلاقه بعد التأكد من صلاحية المدخلات في مربع النص ،
يمكننا استخدامه لازالة علامة الخطأ
حسنا صديقي ، الان اصبح مربع النص آمن من المدخلات الغير مرغوب فيها
يمكنك ايضا التحقق من مدخلات المستخدم لتماشي نمط Regex معين ،
الكود التالي يجعل مربع البريد الالكتروني لايقبل الا صيغة بريد صحيحة :
وبنفس الطريقة :
الآن ماذا نفعل عندما نريد التحقق من صلاحية جميع الادوات في الفورم جملة واحدة ؟
في زر اضافة لقاعدة البيانات مثلا نريد ان نتحقق من كافة المدخلات قبل ان تقع الفأس في الرأس وندخل لقاعدة البيانات بيانات فاسدة
هنا تظهر الدالة ValidateChildren() الخاصة بالفورم
الدالة ValidateChildren :
دالة داخل الفورم تعيد قيمة من نوع bool تمثل هل كافة الادوات في الفورم تحتوي بيانات صالحة ام لا
وهي دالة عبقرية جدا ومفيدة جدا ، تخيل بسطر واحد تتحقق من مدخلات الفورم كله حتى وان احتوى على 600 حقل !
الان الى التطبيق :
سنقوم باستدعاء ValidateChildren() واذا كانت النتيجة false نقوم ب return وبعد ذلك نكتب الاجراء الذي نريده فعلا من هذا الزر ، وبذلك نضمن ان الزر امن تماما
في حدث btnValidate.Click :
طيب كلام جميل الان شغل البرنامج واكتب مدخل سليم في خانة الاسم ، ثم اضغط تحقق
تلاحظ ظهور خطأ ينبهنا الى ان ندخل بريد الكتروني
اذا ادخلنا بريد الكتروني صالح وضغطنا الزر نجد الرسالة تظهر بدون مشاكل ورسالة الخطأ تختفي
حسنا نحن انتهينا تقريبا
ولكن ليس بعد، هناك بعض الخصائص التي نحدد بها سلوك عملية التحقق في الفورم الخاص بنا :
AutoValidate: خاصية للفورم ، نحدد بها ما اذا اردنا ان يقوم الفورم بالتحقق تلقائيا او لا ، وتأخد قيمة من :
AutoValidate.Disable : لا نريد ان يقوم الفورم بالتحقق تلقائيا ، سنقوم به نحن ( مثلا اذا كنا سنستخدم ValidateChildren ولا نريد ازعاج المستخدم برسائل الخطأ)
AutoValidate.EnableAllowFocusChange : نريد ان يقوم الفورم بالتحقق من المدخلات تلقائيا ، ونريده ان يسمح للمستخدم بالتنقل بين المدخلات
AutoValidate.EnablePreventFocusChange (الافتراضية) : نريد ان يقوم الفورم بالتحقق من المدخلات تلقائيا ، ونريده ان يمنع للمستخدم من التنقل بين المدخلات
CausesValidation : خاصية للادوات من نوع bool ، تمثل هل الانتقال الى هذه الاداه يسبب اطلاق احداث التحقق من قيمة الاداه السابقة ؟
المثال في المرفقات
اتمنى للجميع التوفيق
في رعاية الله
السلام عليكم ورحمة الله وبركاته اعضاء المنتدى الكرام
المقال بلغة C#
من المعروف ان غالبية البرامج تتعامل مع مدخلات نصية من المستخدم Textbox ،
ولكن المستخدم غير مضمون ، وبالتالي تضطر لاختبار المدخلات في كل مرة تريد تنفيذ شيء ما بناء عليها حتى لا يحصل exception اثناء تشغيل البرنامج ، وبالطبع عليك تتبع مدخلات المستخدم طوال الوقت ، وقد يحدث ان تنسى مربع نص بدون تتبع مدخلاته فينهار كل شيء
ماذا لو كان هناك طريقة فعالة لتحديد المدخلات المسموح بها لكل مربع نص مرة واحدة فقط ويتكفل البرنامج بالعراك مع المستخدم بدلا منك ؟
هناك بالفعل ما يسمى بالتحقق او Validation للادوات ، بحيث تكتب الكود الخاص التحقق من المدخل للاداه مرة واحدة فقط ، فتصبح الاداة منيعة ضد مدخلات المستخدم الغير متوقعة ، وما تشمله عملية التحقق من اظهار رسالة خطا او ما شابه.
مقادير الطبخة:
قبل ان نبدأ نحتاج ان تصنع مشروعا جديدا للتجربة ،
ومن ثم تضيف له :
- مربع نص TextBox لادخال الاسم ، قم بتسميته txtName
- مربع نص آخر TextBox لادخال البريد الالكتروني ، قم بتسميته txtEmail
- اداه مزود الاخطاء errorProvider لاظهار رسالة الخطأ دون ازعاع المسج بوكس ، دعها باسمها errorProvider1
- زر Button لادخال البيانات الى قاعدة البيانات مثلا ( لن اقوم بهذا فعلا ولكن للتجربة فقط )
الآن اصبح كل شيء جاهز لكتابة الكود
أساس عملية التحقق هما الحدثان Validating و Validated
الحدث Validating: ينطلق عندما تبدأ عملية التحقق ويحدث ذلك عندما تفقد الاداه التركيز Focus عادة ، ويمكنك داخله اضافة الكود الخاص بالتحقق من المدخل اذا كان صالحا ام لا كما يلي :
وسيطة الحدث فيها خاصية e.Cancel من نوع bool ، اذا تم قمنا باسنادها ب true فاننا نخبر الحدث بان هذا المدخل غير صالح ، ويبقي على وضع تركيز الاداه
وبذلك يمكننا التأكد من صلاحية البيانات وفي حالة كانت غير صالة نقوم بجعل e.Cancel=true ونظهر رسالة خطأ مثلا ، والذي سيحدث بعد ذلك انه في كل مرة تحتاج الاداة للحقق من المدخل ستنظهر الى e.Cancel وبالتالي ستحدد ماعيها فعله،
في برنامجنا الصغير قم باضافة الحدث txtName.Validating من قائمة الاحداث ،
الان نريد ان نمنع المستخدم من ادخال قيمة اسم اقل من حرفين ، نضيف الكود التالي :
كود :
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
الان شغل المشروع وحاول ان تكتب قيمة اصغر من حرفين وغادر الاداه ، تلاحظ ظهور خطأ يخبرك بانه عليك ادخال اسم اكبر من حرفين
حسنا صديقي نحن الان في منتصف الطريق تقريبا
جرب ان تكتب قيمة اكبر من حرفين وانتقل الى المربع التالي ، نلاحظ انه ينتقل بدون مشاكل ولكن لم يتم ازالة الخطأ
وهنا يأتي دور الحدث Validated
الحدث Validated:
يتم اطلاقه بعد التأكد من صلاحية المدخلات في مربع النص ،
يمكننا استخدامه لازالة علامة الخطأ
كود :
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
حسنا صديقي ، الان اصبح مربع النص آمن من المدخلات الغير مرغوب فيها
يمكنك ايضا التحقق من مدخلات المستخدم لتماشي نمط Regex معين ،
الكود التالي يجعل مربع البريد الالكتروني لايقبل الا صيغة بريد صحيحة :
كود :
Private Sub txtEmail_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles txtEmail.Validating
Dim txt = DirectCast(sender, TextBox)
If Not Regex.IsMatch(txt.Text, "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$") Then
e.Cancel = True
errorProvider1.SetError(txt, "صيغة بريد الكتروني غير صالحة")
End If
End Sub
وبنفس الطريقة :
كود :
Private Sub txtEmail_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles txtEmail.Validated
Dim txt = DirectCast(sender, TextBox)
errorProvider1.SetError(txt, "")
End Sub
الآن ماذا نفعل عندما نريد التحقق من صلاحية جميع الادوات في الفورم جملة واحدة ؟
في زر اضافة لقاعدة البيانات مثلا نريد ان نتحقق من كافة المدخلات قبل ان تقع الفأس في الرأس وندخل لقاعدة البيانات بيانات فاسدة
هنا تظهر الدالة ValidateChildren() الخاصة بالفورم
الدالة ValidateChildren :
دالة داخل الفورم تعيد قيمة من نوع bool تمثل هل كافة الادوات في الفورم تحتوي بيانات صالحة ام لا
وهي دالة عبقرية جدا ومفيدة جدا ، تخيل بسطر واحد تتحقق من مدخلات الفورم كله حتى وان احتوى على 600 حقل !
الان الى التطبيق :
سنقوم باستدعاء ValidateChildren() واذا كانت النتيجة false نقوم ب return وبعد ذلك نكتب الاجراء الذي نريده فعلا من هذا الزر ، وبذلك نضمن ان الزر امن تماما
في حدث btnValidate.Click :
كود :
Private Sub btnValidate_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnValidate.Click
If Not Me.ValidateChildren() Then Return
MessageBox.Show("جميع البيانات صالحة")
End Sub
طيب كلام جميل الان شغل البرنامج واكتب مدخل سليم في خانة الاسم ، ثم اضغط تحقق
تلاحظ ظهور خطأ ينبهنا الى ان ندخل بريد الكتروني
اذا ادخلنا بريد الكتروني صالح وضغطنا الزر نجد الرسالة تظهر بدون مشاكل ورسالة الخطأ تختفي
حسنا نحن انتهينا تقريبا
ولكن ليس بعد، هناك بعض الخصائص التي نحدد بها سلوك عملية التحقق في الفورم الخاص بنا :
AutoValidate: خاصية للفورم ، نحدد بها ما اذا اردنا ان يقوم الفورم بالتحقق تلقائيا او لا ، وتأخد قيمة من :
AutoValidate.Disable : لا نريد ان يقوم الفورم بالتحقق تلقائيا ، سنقوم به نحن ( مثلا اذا كنا سنستخدم ValidateChildren ولا نريد ازعاج المستخدم برسائل الخطأ)
AutoValidate.EnableAllowFocusChange : نريد ان يقوم الفورم بالتحقق من المدخلات تلقائيا ، ونريده ان يسمح للمستخدم بالتنقل بين المدخلات
AutoValidate.EnablePreventFocusChange (الافتراضية) : نريد ان يقوم الفورم بالتحقق من المدخلات تلقائيا ، ونريده ان يمنع للمستخدم من التنقل بين المدخلات
CausesValidation : خاصية للادوات من نوع bool ، تمثل هل الانتقال الى هذه الاداه يسبب اطلاق احداث التحقق من قيمة الاداه السابقة ؟
المثال في المرفقات
اتمنى للجميع التوفيق
في رعاية الله