PracticU

ולידציה על קלט המשתמש - Validation

בלי כתוביותעם כתוביות
PracticU › קורס WinForms - תוכנות רגילות בווינדוס › ולידציה על קלט המשתמש - Validation
מילון מושגים:
טופס - אזור בממשק שבו המשתמש מזין נתונים בשדות ושולח אותם, למשל טופס הרשמה או התחברות.
אירוע - התרחשות שהמערכת מזהה ויכולה להגיב לה, כמו לחיצת עכבר, הקשה או סיום פעולה.
רכיב - יחידת בניין עצמאית וניתנת לשימוש חוזר בתוך מערכת או ממשק משתמש, שאחראית על חלק מוגדר מהתפקוד.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
מחרוזת - סוג נתונים שמייצג רצף של תווים, כלומר טקסט, ומשמש לאחסון מילים, משפטים או כל רצף סימנים.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.

ולידציה על קלט המשתמש - Validation
השיעור עוסק בולידציה (אימות קלט) של המשתמש: בדיקה שהמידע שהוזן חוקי לפני שימוש בו או שמירה למסד. המטרה היא להציג למשתמש הודעה ברורה על הבעיה בקלט.
דוגמה בסיסית: שם פרטי ושם משפחה
טופס עם שני לייבלים, שתי תיבות טקסט ולחצן Save. בלי בדיקה, לחיצה על הלחצן מציגה הודעה עם ערכים ריקים.
שיטה 1: השבתת הלחצן
- הלחצן מוגדר Enabled = false.
- האירוע TextChanged על שתי התיבות בודק אם שתיהן מלאות, ורק אז מפעיל את הלחצן.
- הדובר הראה שברגע שמוחקים את התו האחרון, הלחצן מתבטל שוב. השיטה פשוטה, אבל לא מציגה למשתמש מה הבעיה.
שיטה 2: אירועי Validating ו-Validated
- Validating: מופעל כשהפוקוס עובר מהתיבה. אם הקלט לא תקין, מגדירים e.Cancel = true, והפוקוס נשאר בתיבה.
- Validated: מופעל רק כשהוולידציה הצליחה. אפשר לנקות הודעות שגיאה בו.
- הדובר הדגים שהפוקוס נתקע בתיבה עד שמזינים ערך, ושזה מתסכל למשתמש שרוצה לצאת. לכן הדובר ציין שהשיטה מחמירה מדי לטופס עם הרבה שדות.
שיטה 3: ErrorProvider
- רכיב ששמים בתחתית הטופס, ומציג סמל קריאה ליד תיבה בעייתית. ההודעה מופיעה בריחוף עם העכבר.
- קוראים ל-errorProvider.SetError(control, "הודעה") כשהקלט לא תקין, ו-SetError(control, "") כשהקלט תקין.
- ב-Validated מנקים את השגיאה של התיבה, ולכן הסמל נעלם ברגע שהמשתמש מתקן.
בדיקות בלחיצה על הלחצן
- בלחיצת Save מפעילים פונקציה isValid() שמבצעת את כל הבדיקות, אחת אחרי השנייה, ומחזירה true או false.
- בתחילת הפונקציה מנקים את כל ההודעות (errorProvider.Clear()), כך שלא נשארות הודעות ישנות.
- קומבו-בוקס של מצב משפחתי: SelectedIndex מחזיר -1 כשלא נבחר דבר. לכן בודקים == -1, ולא מחרוזת ריקה. הדובר הסביר שאם מוסיפים פריט ריק לרשימה, המשתמש יכול לבחור אותו בטעות, ולכן עדיף לא להוסיף אותו.
MaskedTextBox ו-Regular Expression
- MaskedTextBox עם מסכה של מספר טלפון מונע הקלדת אותיות ומגביל את מספר הספרות. עדיין אפשר להזין ערך חלקי, ולכן צריך בדיקה נוספת.
- Regular Expression: שפה לבדיקת חוקיות מחרוזת. בונים אובייקט Regex עם תבנית, ובודקים IsMatch. הדובר הציג תבנית לטלפון נייד ישראלי שמתחילה ב-05 ואחריה ספרות. לאימייל הדובר השתמש בתבנית שהעתיק מהאינטרנט, והתברר שהיא לא תקינה: היא קיבלה רק אותיות גדולות. הוספת טווח a-z פתרה את הבעיה, והסבר: לא כל תבנית מהאינטרנט נכונה, וצריך לבדוק.
דגשים
- הודעת שגיאה צריכה לומר מה חסר או מה לא תקין, לדוגמה "Missing first name".
- ב-MessageBox לכל תיבה מציגים הודעה נפרדת מפריע למשתמש, לכן מעדיפים ErrorProvider.
- טופס עם שדות חובה ושדות אופציונליים: שדה אופציונלי נבדק רק אם המשתמש הזין בו ערך.
בסיום השיעור הסטודנט יודע לבחור דרך אימות מתאימה לכל מקרה, להציג שגיאות בעזרת ErrorProvider, ולבדוק פורמטים כמו טלפון ואימייל בעזרת Regular Expression.
השיעור הבא בקורס: תיבות דו-שיח - Build-In Dialog Boxes

פרקי ההרצאה: ולידציה על קלט המשתמש - Validation

  1. 00:00

    הכרת ולידציה על קלט המשתמש

  2. 03:15

    הפעלת הלחצן לפי תוכן התיבות

  3. 06:04

    אירועי Validating ו-Validated

  4. 11:23

    רכיב ה-ErrorProvider

  5. 16:03

    ולידציה בלחיצה על הלחצן

  6. 22:53

    בניית הפונקציה IsValid

  7. 27:58

    ניקוי שגיאות עם Clear

  8. 28:36

    ולידציה ל-ComboBox ולשדות נוספים

תמלול ההרצאה: ולידציה על קלט המשתמש - Validation

הטקסט המלא של הדקות הראשונות בהרצאה «ולידציה על קלט המשתמש - Validation» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    אנחנו מגיעים לנושא מאוד חשוב בעולם הווינפורם ומשק המשתמש שנקרא ולידיישן. ולידיישן או בעברית ולידציה זה בעצם הפעולה של אימות הקלט של המשתמש.

  2. 00:19

    אנחנו רוצים לוודא שמה שהמשתמש מכניס זה נכון מבחינתנו וחוקי מבחינתנו. לדוגמה אם אנחנו חייבים שהוא יכניס שם פרטי ושם משפחה אז אנחנו לא יכולים שהוא ישאיר תיבות טקסט כאלו ריקות.

  3. 00:34

    אם אנחנו רוצים שהוא יכניס אימייל חוקי אנחנו לא יכולים שהוא יכניס ג'יבריש. בכל המצבים האלה אנחנו רוצים להציג איזושהי הודעת חיווי למשתמש ולהסביר לו מה הבעיה עם הקלט שלו.

  4. 00:47

    אז בואו נראה מספר שיטות לבצע את זה. דבר ראשון בואו ניקח ונבקש מהמשתמש משהו פשוט כמו שם פרטי ושם משפחה. ניקח lbl first name, נבקש מהמשתמש שיכניס לנו first name, יש לנו פה את הטופס שטיפה נסדר אותו, מקסימייזד, כולו לא רוצים.

  5. 01:22

    יש לנו תיבת טקסט לצורך הכנסת שם פרטי, נקרא לתיבת txt first name, נשכפל את שני הרכיבים האלה, ctrl-c, ctrl-v, נשים אותם אחד ליד השני, הלייבל הזאת הופכת להיות lbl last name, טקסט שכתוב עליה יהיה last name, ותיבת הטקסט הזאת הולכת להיות txt last name.

  6. 02:01

    כעת אנחנו רוצים שיהיה לנו איזשהו לחצן שבוא נניח שומר את הפרטים במערכת. זה יהיה btn save. בוא נניח שזה ממשק המשתמש ואלו הפרטים שאנחנו רוצים לקבל מהמשתמש.

  7. 02:24

    כאשר אנחנו לוחצים על הלחצן אנחנו רוצים להציג את המידע. messagebox txt first name text משורשר עם txt last name text ובוא נניח שהפעולה הזאת זה פעולה שמדמה שמירה.

  8. 02:49

    אבל רגע, אם אנחנו כרגע נריץ את התוכנית ולא נכניס כלום מבחינת משתמש, האם באמת תהיה לנו איזושהי הודעת שגיאה או שהוא פשוט יציג לנו מידע ריק?

  9. 03:03

    בואו נריץ, נלחץ על הכפתור בלי להכניס שום דבר וכמובן אין פה שום ולידציה ואם היינו שומרים באמת את המידע הזה לדייטאבייס הוא היה שומר לנו מכרוזות ריקות לתוך הדייטאבייס.

  10. 03:17

    אם אני רק בחלק מהתיבות טקסט מכניס מידע אז כמובן רק במה שהכנסתי יהיה מידע ולא בשני אנחנו רוצים לבצע פעולת ולידציה שיטה ראשונה מאוד פשוטה אומרת דבר כזה אף אחד לא יכול ללחוץ על הלחצן אם אין מידע בתיבות אז בואו ניגש וקודם כל נלך ללחצן לתכונה שנקראת enabled ונגדיר false ואומר שאם אנחנו מריצים הלחצן בכלל אי אפשר ללחוץ עליו שימו לב אני מריץ

  11. 03:48

    את הטופס ואין הלחצן לא מאופשר גם אם אני מכניס מידע כרגע הוא לא מאופשר מה מה שאנחנו רוצים לעשות זה במידה והיוזר הכניס פרטים גם בתיבת ה-first name וגם בתיבת ה-last name אז אנחנו רוצים לאפשר את הלחצן.

  12. 04:04

    זה אומר שאנחנו יכולים עכשיו לתפוס את שתי תיבות הטקסט ללכת לתכונה שנקראת text change שמתבצעת כאשר משנים את הטקסט בתיבות. בגלל שאנחנו רושמים את האירוע הזה לכמה תיבות טקסט בואו ניתן לאירוע שם כללי טקסט בוקסס אנדרליין טקסט צ'יינג'ד וכל מה שאנחנו רוצים לעשות זה בכל תו לבצע בדיקה האם שתי תיבות הטקסט מלאות בנתונים רק אם כן לאפשר את הלחצן זה אומר btm save נקודה

  13. 04:44

    enabled שווה להאם בtxt first name נקודה טקסט הטקסט שלו שונה ממחרוזת רקע וגם txt last name נקודת טקסט שונה ממחרוזת רקע. רק אם שני המצבים האלה מתקיימים אנחנו רוצים להכניס ב-enabled true אם הפנאי הזה שווה false כמובן ב-enabled הולך להיכנס false

  14. 05:12

    האירוע הזה מתרחש לפני הלחיצה ולכן מן הראוי שהוא יהיה מעליו בואו נריץ אני מכניס לכאן את השם מוישה עדיין לחצן הסייב לא מאופשר אני מכניס לכאן את השם כהן איך שאני מתחיל לכתוב אני כבר רואה שהלחצן מאופשר אם אני כרגע חוזר בחזרה בוא נניח למוישה ומוחק אותו, שימו לב מה קורה כשאני מוחק את התו

  15. 05:42

    האחרון, לחצן לא מאופשר. כל לחיצה על המקש אתם רואים שיש לנו בדיקה חוזרת או שאנחנו מאפשרים או שאנחנו לא מאפשרים את הלחצן.

  16. 05:55

    כאשר יש לנו בדיקות מאוד מאוד פשוטות כאלו אז יכול להיות שהדבר הזה הוא בסדר מבחינת ההצגה למשתמש, אין פה מי יודע מה הצגה של הודעות שגיאה.

  17. 06:07

    אבל בואו נראה עכשיו שיטות נוספות השיטה הבאה שאנחנו הולכים לראות זאת שיטה שמשתמשת באירועים מיוחדים שקיימים בתיבות קלט לדוגמת תיבות טקסט והאירועים האלה נקראים ואלי דייטינג וואלי דייטד ואלי דייטינג זה אירוע שמתרחש כאשר הפוקוס יוצא מהתיבה כלומר ברגע שהיוזר מנסה לעבור

  18. 06:41

    לתיבה אחרת אחרי שהוא היה בתיבה אז אוטומטית אירוע ואלידייטינג מתרחש ואומר לנו בואו תבדקו האם המידע הוא בסדר או לא בסדר. אם הוא לא בסדר יש לנו אפשרות בתוך האירוע הזה לבטל את השינוי פוקוס.

  19. 07:01

    תכף אנחנו נראה איך עובדים עם זה. אירוע ואלידייטד מתרחש רק כאשר פוקוס הצליח, לא ביטלנו אותו ומבחינתנו הוולידציה הצליחה. אז מה שנעשה זה נתפוס את שתי תיבות הטקסט, נלך לאירוע ולידייטינג וניתן לו איזשהו שם כללי.

  20. 07:25

    טקסט בוקסז אנדרליין ולידייטינג. אוקיי, זאת אומרת איך שהפוקוס של התיבות טקסט אמור להתחלף או להשתנות, האירועים האלה אמורים להתבצע.

  21. 07:45

    האירוע הזה אמור להתבצע, לא משנה איזה תיבה. בואו נבצע את אותו הדבר, עבור אירוע ה-validated. ניגש לאירוע ה-validated ונרשום text boxes underline validated והאירוע הזה מתבצע רק אם הוולידציה הצליחה.

  22. 08:09

    כל תיבת טקסט שמפעילה את האירוע כמובן שולחת את עצמה ל-sender. כל מה שאנחנו צריכים לעשות זה כזה דבר. אי נקודה אנחנו רואים שיש לנו פה cancel האם אנחנו אנחנו רוצים לבטל את ההוצאה של הפוקוס או ליתר דיוק את העיבוד פוקוס.

  23. 08:31

    אנחנו יכולים להכניס את הדבר הבא sender as textbox.text שווה למחרוזת ריקה. זאת אומרת אם אין שום דבר בתוך תיבת הטקסט cancel יהיה true וזה יגרום לעיבוד פוקוס לא להצליח בעצם.

  24. 08:57

    בואו קודם כל נבדוק איך זה עובד. אני אריץ את התוכנית, אוטומטית המידע נמצא בתיבת הטקסט הראשונה. שימו לב, אני מנסה לעבור עם העכבר לתיבת הטקסט השנייה ואני לא מצליח.

  25. 09:12

    ושימו לב למשהו עוד יותר מוזר, אם אני מנסה לסגור את הטופס, אני לא מצליח. רגע, רגע, למה אני לא מצליח לסגור את הטופס? אז מה שקרה כאן זה שאני בכלל לא מצליח לצאת מהתיבה, רק אם אני ארשום מידע, אז אני אצליח לצאת מהתיבה.

  26. 09:32

    עכשיו אני תקוע בתיבה השנייה כן רק אם אני ארשום מידע בתיבה השנייה אז אני אצליח בעצם לצאת. קצת לא ברור למשתמש מה קורה כאן כי תחשבו שמשתמש יכול לא להבין מה קרה ולנסות לסגור את הטופס ולא להצליח אנחנו צריכים להציג לו פה איזושהי הודעת חיווי אז בואו לצורך ההצגה של הודעת החיווי נניח נעלה message box אם הוולידציה נכשלה אפילו נעשה את זה בצורה כזאת.

  27. 10:10

    אם המידע שווה למחרוז הטריקה, cancel יהיה שווה ל-true, אבל אנחנו רוצים גם להציג איזשהו message box. Please enter first name.

  28. 10:35

    למעשה זה לא בטוח שזה first name, כי כל תיבה תעלה לנו את האירוע הזה. אז please enter value to the text box. בואו נריץ, נכניס מידע בתיבה הראשונה.

  29. 11:07

    יש לנו אפשרות לגשת לתיבה השנייה. ננסה לצאת מהתיבה השנייה ונחטוף הודעה Please enter a value to the textbox. רק אם המשתמש מכניס ערך הוא יכול לגלוש החוצה.

  30. 11:18

    ננסה לעשות את אותו הדבר בתיבה הראשונה Please enter a value to the textbox. אוקיי, בואו נראה אבל שיטה אחרת מפני שמסג'בוקסים יכולים טיפה להפריע למשתמש.

  31. 11:32

    בואו נסגור את הטופס ונכיר איזשהו רכיב נוסף שקיים ב-Components. בסרגל הקומפורננס, והוא נקרא ErrorProvider. ErrorProvider זה רכיב שמסוגל להציג הודעות שגיאה.

  32. 11:57

    איך אנחנו עובדים איתו? נחזור בחזרה לקוד, ובמקום להציג הודעת שגיאה, נשים את זה בהערה, נקרא לה ErrorProvider ונקרא לפונקציה שנקראת SetError.

  33. 12:17

    לפונקציה הזאת נשלח את תיבת הטקסט שהעלתה את האירוע, ונשלח איזושהי הודעה שמציגה מה בדיוק הבעיה. לדוגמה, אנחנו רואים שsender זה Object ולכן יש לנו פה צורך ב-Casting.

  34. 12:49

    בואו נראה כרגע, עכשיו זה הסתדר. במקום להציג הודעת MessageBox, פשוט אמרנו ל-Hero Provider להציג את השגיאה עכשיו. הנקודה המעניינת זה איך בדיוק ה-Hero Provider הולך להציג למשתמש את השגיאה.

  35. 13:04

    בואו נריץ. ננסה לצאת מהפוקוס של התיבה הראשונה ושימו לב מה אנחנו רואים. אנחנו רואים בעצם איזשהו סימן קריאה שמוצמד ליד התיבה.

  36. 13:18

    אם אנחנו מרחפים עליו, אנחנו רואים את ההודעה שהגדרנו. אז אם עכשיו היוזר מכניס ערך, עובר לתיבה השנייה, מנסה לעבור לתיבה הראשונה, חוטף את אותה שגיאה בתיבה השנייה.

  37. 13:34

    יש פה רק בעיה שלא ניקינו את ההודעה הקודמת, את הסימן קריאה הקודם. בשביל זה אנחנו צריכים את האירוע השני, ולידייטד. ולידייטד מתרחש כאשר הוולידציה הצליחה.

  38. 13:52

    אז כל מה שאנחנו רוצים לעשות זה לבוא ולהגיד כזה דבר. הסנדר שגרם להצלחה של הוולידציה, אנחנו רוצים לשלוח לו מחרוזת ריקה. בואו נראה אם זה יעלים לנו את ה-error provider.

  39. 14:13

    קודם כל נכניס, ננסה לגלוש לתיבה השנייה, לאבד פוקוס מבלי להכניס ערך. אנחנו רואים את ה-error provider מופיע. נכניס ערך, נבצע פוקוס והוא נעלם.

  40. 14:29

    ננסה לעשות פוקוס לתיבה הראשונה מבלי לעשות שום דבר בתיבה השנייה. נחטוף הודעת שגיאה, נכניס לכאן איזשהו ערך, ננסה לאבד פוקוס והכל בסדר.

  41. 14:43

    אפשר עכשיו ללחוץ גם על הכפתור. אז ה-error provider הזה אפשר לממשק משתמש להראות איזושהי נקודה של סימן קריאה בסמוך לתיבה שנשלחה אליו.

  42. 14:59

    הרכיב הזה פשוט מציג את עצמו ליד אותה תיבה שנשלחה אליו. לא בטוח שהשיטות האלה הן שיטות טובות מי יודע מה עבור הצגות שגיאה למשתמש ואני מדבר ספציפית על אירוע ולידייטינג וולידייטן.

  43. 15:17

    אירוע פרוביידר אין איתו שום בעיה הוא ממש כיפי וממש נותן אינדיקציה יפה. למה האירועים האלה הם טיפה בעייתיים? כי תחשבו שהמשתמש עכשיו התחרט, ובעצם הוא רוצה לסגור את הטופס והוא לא רוצה להכניס שום פרטים, ויש לו פה סדרה של פרטים שהוא צריך להכניס והוא לא רוצה.

  44. 15:38

    או שזה לא שהוא צריך להכניס מידע, הוא צריך להכניס מידע חוקי והוא לא בדיוק הבין מה המידע החוקי שאנחנו דורשים ממנו ורוצה להתחרט. הוא לא יכול אפילו לסגור את הטופס.

  45. 15:49

    זאת אומרת שהבדיקות האלה עם אירוע ואלי דייטינג וואלי דייטד יכולות להיות טיפה קשוחות מדי עבור המשתמש ואלה בדיקות שאומרות לו אם אתה לא מכניס באמת את המידע שאני רוצה אתה לא יכול לזוז מילימטר מהתיבה אז לא בטוח שזה הדבר שאנחנו רוצים להציג למשתמש בעיקר אם יש לו הרבה מידע להכניס ובעיקר אם המידע יכול

  46. 16:12

    להיות טיפה מורכב מבחינת החוקיות שלו לכן בואו נראה שיטה נוספת שהיא קצת יותר ברורה עבור המשתמש גם כאן אנחנו הולכים להשתמש עם ה-Aero Provider וגם כאן אנחנו הולכים להשתמש עם אירועים מסוימים, אבל אנחנו הולכים לבצע את הבדיקה בלחיצה על הלחצן.

  47. 16:34

    לצורך הדוגמה בואו נוסיף טופס חדש בכדי ששתי הדוגמאות יופיעו לנו. אז יש לנו טופס שני, נשאיר לו את השם פורם 2, למרות שהיה הגיוני לתת לו איזשהו שם שמעיד על מה הוא בדיוק עושה.

  48. 16:54

    לצורך הדוגמה ניקח אפילו את הגרפיקה מהטופס הראשון, קונטרול סי, נעבור לטופס השני ונדביק, אם נשים את זה פה בצד, נחזור בחזרה, נעתיק את ה-Aeror Provider, קונטרול סי, נדביק אותו בטופס הזה, ואני רוצה להוסיף עוד כמה דברים.

  49. 17:23

    דבר ראשון, מה שאני רוצה להוסיף זה מצב משפחתי. אני רוצה שהיוזר יכניס את המצב המשפחתי שלו. לצורך כך ניקח לייבל, נגדיר לה שהניים שלה זה lbl, בואו נקרא לזה familyStatus וניקח קומבו בוקס, אנחנו צריכים רק גם את הטקסט להציג עליה, familyStatus, נזיז את כל אלה טיפה

  50. 18:03

    הצידה ויש לנו כאן איזשהו קומבו בוקס שיכול להציג למשתמש familyStatus. מה שאנחנו רוצים לעשות זה להכניס מראש את הערכים הנכונים ל-Family סטטוס למצב משפחתי.

  51. 18:21

    הערך הראשון הוא ריק, אז אני פשוט ארד שורה, ולאחר מכן יש לנו את הערכים Single, Married, Rebursed ו-Weed-Aware. יש לנו רווק, נשוי, גירוש, אלמן, מבצע אוקיי, וכעת היוזר צריך לבחור אחד מהערכים האלה של ה-Family סטטוס.

  52. 18:57

    מה שאנחנו רוצים בנוסף להכניס ולבקש מהמשתמש טלפון לצורך כך ניקח label נגדיר שה name שלה זה ldl phone ולצורך הדוגמא ניקח masked textbox כי masked textbox מאפשר להגדיר איזושהי מסכה שהיוזר לא יכול להכניס דברים שהם לא חוקיים מבחינתנו אז ניקח phone number ונגדיר

  53. 19:42

    ניקח phone number בצורה כזאת, נגדיר שמעבר לשלוש ספרות קידומת יש לו שבע ספרות שבהן הוא צריך להכניס רק digits. כמה יש לנו פה? 1, 2, 3, 4, 5, 6, 7. בסדר, בואו נבצע.

  54. 20:01

    כעת היוזר חייב להכניס ספרות לטלפון, הוא לא יכול להכניס אותיות, זה כבר סוג של ולידציה. אבל אני רוצה עוד דבר אחד, והדבר שאני רוצה זה אימייל.

  55. 20:14

    ו-E-Mail אני כבר לא יכול לקחת Masked Text Box מפני שזה לא בדיוק מסכה שאני יודע בול כמה תווים יש ב-E-Mail. הוא יכול להכניס כמה תווים שהוא רוצה. הבעיה ב-E-Mail זה שישנן תווים לא חוקיים וישנו פורמט לא חוקי לגבי E-Mail.

  56. 20:36

    ואיך אנחנו בודקים שגם ה-E-Mail שלו נכון? בואו נראה את זה. ה-Label מבקש מהמשתמש E-Mail והשם שלה יהיה TXT-E-Mail, תיבת הטקסט, תקרא txt-email יש לנו כבר txt-email למה יש לנו txt-email כי הלייבל קראתי לה txt-email ובמקום לקרוא לה lbl-email טעות שלי לא קרה כלום בואו עכשיו ננסה לקרוא txt-email

  57. 21:24

    לתיבת הטקסט וכמובן אין שום בעיה הלחצן נקרא btn-save נצמצם את הטופס וזה ממשק המשתמש שאנחנו רוצים נוריד את הכותרת פורום 2, נגדיר שהטופס תמצא במרכז המסך, נשמור, ואיך נכון עכשיו לבצע את הוולידציה.

  58. 21:56

    אז מה שנכון לעשות במקרים האלה זה לא בהכרח ללכת ולבטל את הקליק של הלחצן כמו שעשינו מקודם, לא להגדיר אותו כ-enabled. בואו נסתכל רגע, נראה שהתכונה היא enabled, נחזיר אותה בחזרה ל-true, מפני שתקנו את הלחצן הזה מהטופס הקודם, אז הוא לקח גם את התכונה Enabled False.

  59. 22:23

    כעת האיוזר כן יכול ללחוץ על הלחצן, אבל מה שאנחנו רוצים לעשות זה לאפשר לו ללחוץ על הלחצן ופשוט להציג לו אירו פרוביידר ליד כל תיבה שהיא לא חוקית מבחינתנו.

  60. 22:36

    כמו כן, אנחנו רוצים לבצע פה בדיקות קצת יותר מורכבות, כמו לדוגמה אימייל או אפילו טלפון. אז איך אנחנו עושים את זה?

  61. 22:48

    קודם כל, אנחנו הולכים לקליק של הלחצן. דאבל קליק על הלחצן, אנחנו מגיעים לאזור של הקליק שלו. מה שאנחנו רוצים לעשות זה לבנות פונקציה נפרדת private שתחזיר לנו ערך בולעני.

  62. 23:06

    נקרא לה isValid. הפונקציה הזאת תבצע את כל בדיקות הוולידציה שקיימות כי יש פה סדרה של בדיקות וולידציה ובסופו של דבר תחזיר true או false האם הבדיקה עברה בהצלחה או לא.

  63. 23:25

    בתוך הפונקציה הזאת אנחנו צריכים רכיב רכיב לבצע את הבדיקה וכל רכיב שהבדיקה נכשלת אנחנו מציגים את הודעת השגיאה ולא ממשיכים הלאה.

  64. 23:35

    אנחנו לא נציג למשתמש את כל הודעות השגיאה בבת אחת ונכניס אותו להלם. אז דבר ראשון אנחנו בודקים האם txt first name הוא חוקי. מבחינתנו חוקי זה שונה מנ"ל או ליתר דיוק בואו נעשה הפוך בואו נבדוק האם יש איתו בעיה האם הוא שווה למחרוזת רקע.

  65. 23:58

    אם יש איתו בעיה והוא שווה למחרוזת רקע אנחנו רוצים לעשות את הפעולות הבאות. אנחנו רוצים ללכת ל-error provider שאם אנחנו כבר בענייני שמות חוקיים אז כמובן אנחנו תמיד נרצה ללכת ולתת שמות יותר משמעותיים earr זה קיצור של error show error נקרא לו או בוא נקרא לו קצת שם אחר earr details כי אנחנו רוצים לקבל details מהמשתמש זה השם של ה-error provider שהוא קצת יותר

  66. 24:38

    אסתטי מבחינת הקוד מה שאנחנו רוצים לעשות זה err.details.set.error ולתת את תיבת הטקסט txt first name עם הודעת השגיאה שהיא קצת יותר ספציפית מהדוגמה הקודמת missing first name לאחר מכן אנחנו רוצים להחזיר false אותו הדבר מבצע עבור txt last name missing last name אם הכל בסדר אנחנו רוצים

  67. 25:10

    to return true מסוף הפונקציה בלחצן כל מה שאנחנו צריכים לעשות זה לבצע בדיקה אם is valid הוא not return. אם הכל בסדר, אנחנו רוצים לשמור את הנתונים.

  68. 25:45

    כרגע בואו נעשה alert, saving all data. אנחנו ב-c-sharp, אז נשתמש ב-messagebox.show. אם היינו ב-JavaScript, אז alert הייתה עובדת לנו.

  69. 26:10

    בסדר, בואו נבדוק כרגע את הטופס הזה. לצורך כך אנחנו צריכים לגשת למחלקה פרוגרם ולהעלות את פורום 2 במקום פורום 1, רק בשביל לבדוק את תקינות הטופס הזה במקום הקודם.

  70. 26:28

    אני מריץ, לא מכניס כלום ל-first name, לוחץ על save, רואה את הודעת השגיאה שאם אני עומד עליה ההודעה יותר ספציפית ומתאימה לתיבה הזאת, מכניס מידע, פוקוס, לא מעיף את זה, לוחץ על save, רואה את ההודעת שגיאה של התיבה השנייה, אבל הודעת השגיאה של התיבה הראשונה לא נעלמת.

  71. 26:55

    בואו נטפל בזה. קודם כל, מה שאנחנו רוצים לעשות זה אלס. באלס אנחנו רוצים להגדיר מחרוזת ריקה. זה היה עבור txt first name, ואנחנו רוצים את זה לגבי txt last name.

  72. 27:34

    בואו נבדוק. לא נכניס כלום בתיבה הראשונה ונחטוף שגיאה. נכניס מידע, נעבור, נלחץ על save, ונראה שההודעת שגיאה הראשונה נעלמה ויש לנו כמובן הודעת שגיאה בתיבה השנייה.

  73. 27:53

    ישנה שיטה קצת יותר רלגנטית, במקום לבצע לכל תיבה אלס מה שאנחנו יכולים לעשות זה בתחילת הוולידציה לרשום err details.clear ומנקה את כל הודעות השגיאה הקודמות וזה אומר שאנחנו לא צריכים את האלסים האלה יותר קצת חסכנו קוד בואו נריץ ננסה שוב נלחץ על לחצן הסייב נחטוף שגיאה בתיבה הראשונה נכניס איזשהו ערך, נלחץ

  74. 28:23

    על לחצן הסייב וההודעת שגיאה הקודמת כבר נעלמה, יש לנו הודעת שגיאה חדשה. נכניס ערך גם כאן, נלחץ על סייב, ולידציה הצליחה, שומרים את המידע.

  75. 28:36

    אבל אנחנו צריכים לבצע ולידציה בכל היתר. אז בואו נמשיך ונבדוק גם את התיבות הבאות. התיבה הבאה שאנחנו רוצים לבדוק זה ה-FamilyStatus. מה שאנחנו רוצים רק לבדוק שהיוזר אכן בחר פריט בתיבה של מצב המשפחתי.

  76. 28:56

    כאן כל מה שאנחנו יכולים לעשות זה cbo ואני רואה שכבר שכחתי לתת שם לקומבו בוקס כי אם הייתי נותן אז הוא בהכרח היה מתחיל ב-cbo בואו נחזור וניתן לו cbo family סטטוס נלך ל-save if cbo family סטטוס נקודה selected index

לקורס המלא: קורס WinForms אונליין

ההרצאה הקודמת: רכיב ה-TreeView

ההרצאה הבאה: תיבות דו-שיח - Build-In Dialog Boxes

הרצאות קשורות מקורסים אחרים

  • ולידציה - Validation
  • Validation - ולידציה
  • ולידציה בריאקט - React Validation
  • מאפינים של המשתמש

קורסים נוספים במסלול

  • פרויקט מעשי ב-#C - בונים מחשבון פשוט
  • פרויקט מעשי ב-#C - ספר טלפונים
  • פרויקט מעשי ב-#C - תוכנת צייר
  • קורס ADO.NET - חיבור אתר למסד נתונים
  • קורס תכנות מתקדם - #Advanced .NET C
  • קורס WCF - תקשורת למתקדמים בדוט-נט