PracticU

פרוייקט חדש - WinForm Project

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

פרוייקט חדש - WinForm Project
השיעור מציג את פרויקט Windows Forms Application המוכן, ואת עיצוב הטופס ויזואלית בעזרת הדיזיינר של Visual Studio. במקום לכתוב את כל הרכיבים בקוד, הרכיבים נגררים לטופס והקוד נכתב רק לאירועים.
הפרויקט וקבציו
1. התבנית: פרויקט Windows Forms Application מכין תשתית מוכנה, כולל ההפניות הנדרשות ו-Form1 שנפתח בדיזיינר. הדובר יצר פרויקט בשם Details Application.
2. שם הקובץ: הדובר שינה את שם הקובץ מ-Form1.cs ל-Details Form.cs, כדי שישתווה לשם המחלקה. זו מוסכמה לקובץ נפרד בשם המחלקה.
זמן עיצוב מול זמן ריצה
- Design time: מעצבים את הטופס, והעבודה היא על תמונה של הטופס.
- Run time: האפליקציה רצה והטופס האמיתי פועל, כמו אצל המשתמש.
החלונות המרכזיים
- Toolbox: רכיבים לגרירה לטופס, כמו לחצן, לייבל ותיבת טקסט.
- Properties: התכונות של הרכיב שנבחר. בתחתית החלון מופיע תיאור של התכונה. הדובר ממליץ למיין את התכונות לפי א-ב, כי קשה למצוא תכונה לפי קטגוריה.
- Format: יישור הרכיבים, כולל גודל זהה (Make same size), יישור לימין, מרווחים שווים, מרכוז לטופס, ונעילת הרכיבים (Lock Controls) בסוף העיצוב.
עיצוב הטופס
1. הטופס עצמו: קודם מגדירים גופן, כותרת, צבע רקע, גודל, ביטול לחצן ההגדלה, ו-StartPosition במרכז המסך.
2. רכיבים: לייבלים, תיבות טקסט ולחצנים. הדובר משתמש בקווים הכחולים והאדומים שמופיעים בזמן גרירה כדי ליישר את הרכיבים.
3. העתקה: אחרי שמגדירים רכיב אחד, אפשר להעתיק אותו (Ctrl+C ו-Ctrl+V) ולשנות רק את הטקסט והמיקום.
שמות לרכיבים
כל רכיב מקבל שם משמעותי עם תחילית של שלוש אותיות בדרך כלל, למשל lblFirstName, txtFirstName, btnOk ו-btnCancel. השם הזה הוא שם השדה במחלקה, ולכן משתמשים בו בקוד. הדובר ציין שהמוסכמות הללו נהוגות בכל העולם.
אירועים בדיזיינר
- לחיצה כפולה על רכיב פותחת את האירוע הדיפולטי שלו, לדוגמה Click של לחצן.
- לאירועים אחרים בוחרים בלשונית Events בחלון Properties.
- הרישום לאירוע נכתב אוטומטית בקובץ ה-Designer, והקוד הלוגי נכתב בקובץ הרגיל.
- מחיקה של פונקציית אירוע בלי איפוס משאירה רישום, והקומפילציה נכשלת. לכן מומלץ לבטל את האירוע דרך חלון המאפיינים.
קובץ ה-Designer
המחלקה היא partial class: הדיזיינר כותב את הקוד בקובץ נפרד, ובו הפונקציה InitializeComponent שיוצרת את הרכיבים ומגדירה אותם. מומלץ לא לערוך את הקובץ הזה ידנית, כי כל שינוי בדיזיינר דורס אותו.
הרצה
- מגדירים את Output type ל-Windows Application כדי שחלון הקונסול לא יופיע.
- Application.Run מריץ את הטופס הראשי.
בסיום השיעור הסטודנט יודע לעצב טופס בדיזיינר, לתת שמות לרכיבים, ולכתוב קוד לאירועים בלי לעבוד ידנית עם קוד העיצוב.
השיעור הבא בקורס: רכיבים נפוצים - Common Controls

פרקי ההרצאה: פרוייקט חדש - WinForm Project

  1. 00:00

    יצירת פרויקט WINDOWS FORMS

  2. 01:43

    DESIGN TIME מול RUN TIME

  3. 02:41

    חלונות ToolBox ו-Properties

  4. 05:47

    עיצוב מאפייני הטופס

  5. 08:06

    הוספת רכיבים לטופס

  6. 09:43

    הוספת לחצני OK ו-Cancel

  7. 10:56

    תפריט FORMAT ליישור רכיבים

  8. 15:59

    המאפיין NAME של הרכיבים

תמלול ההרצאה: פרוייקט חדש - WinForm Project

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

  1. 00:03

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

  2. 00:23

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

  3. 00:38

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

  4. 00:55

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

  5. 01:17

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

  6. 01:31

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

  7. 01:54

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

  8. 02:08

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

  9. 02:19

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

  10. 02:32

    כעת אנחנו באמת רואים את הטופס האמיתי, אם אנחנו לוחצים לדוגמה על ה-X הוא נסגר. אז יש הבדל בין design time שבו אנחנו יכולים לעצב את הטופס שלנו לבין run time שבו הטופס באמת רץ, זה כאילו שהיוזר מריץ את התופס ועובד איתו.

  11. 02:49

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

  12. 03:09

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

  13. 03:22

    אחרי שגררנו את הרכיבים אנחנו רוצים לתת להם תכונות. אנחנו יכולים לבחור את הרכיב הרצוי ואז בעזרת החלונית פרופרטיז לתת תכונות באותו רכיב.

  14. 03:34

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

  15. 04:18

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

  16. 04:35

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

  17. 04:58

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

  18. 05:16

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

  19. 05:30

    מה זה ה-Description? אם אנחנו בוחרים איזושהי תכונה אנחנו יכולים לראות פה תיאור לגבי מה זאת התכונה הזאת. טקסט. The text associated with the control.

  20. 05:41

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

  21. 06:01

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

  22. 06:13

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

  23. 06:34

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

  24. 06:46

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

  25. 07:08

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

  26. 07:42

    נחפש אותו פה והנה הצבע הזה. מעולה. אחרי שהגדרנו את כל ההגדרות של הטופס האמת ישנה הגדרה אחת שגם נתנו אותה וזה Start Position זה היה Center Screen וכעת אם אנחנו נריץ הטופס יעלה במרכז המסך בואו נריץ והנה הטופס עולה במרכז המסך מה שנשאר לנו לעשות זה להגדיר את הרכבים

  27. 08:15

    שעליו דבר ראשון נשים Label בואו ניתן טקסט Enter First Name ונגדיר תיבה טקסט שימו לב שמעבר לזה שזה מאוד מאוד קל להגדיר את המיקומים של הרכיבים השונים.

  28. 08:39

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

  29. 08:52

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

  30. 09:10

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

  31. 09:30

    אנחנו יכולים להזיז את זה ולהתאים את זה לאן שאנחנו רוצים. לאחר מכן אנחנו יכולים לבחור רכיבים נוספים ולתת להם את התכונות הדרושות. זה יהיה Enter Last Name.

  32. 09:43

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

  33. 10:10

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

  34. 10:33

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

  35. 10:47

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

  36. 11:10

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

  37. 11:30

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

  38. 11:43

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

  39. 11:53

    אז אני בוחר את כולם, אני יכול לראות שאני יכול להחליף ולקבוע שמישהו אחר מקבל נקודות אחיזה לבנות, ולאחר מכן אנחנו לפורמט, make same size, or width, or height, or both.

  40. 12:06

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

  41. 12:21

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

  42. 12:38

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

  43. 13:03

    ולבסוף אני יכול to lock controls במידה ואני נועל את הפקדים, זה אומר שאני לא יכול יותר להזיז את הפקדים בדיזיינר, ועושים את זה כאשר סיימנו לעצב את הטופס.

  44. 13:17

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

  45. 13:33

    ניקח איזשהי לייבל, נזרוק אותה כאן נניח, נגדיר enter your details, אבל אני רוצה שהכותרת הזאת תהיה בדיוק במרכז הטופס אז אני בוחר אותה, הולך לפורמט center inform horizontal ואוטומטית הדיזיינר יגיד לי בול איפה זה מרכז הטופס.

  46. 14:01

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

  47. 14:20

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

  48. 14:37

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

  49. 15:02

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

  50. 15:22

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

  51. 15:41

    בואו נרשום yes. אם אנחנו עכשיו לוחצים מקש ימני ובוחרים ב-view code, אנחנו הולכים לראות שבעצם נוצרנו איזושהי מחלקה שנקראת Details Form והיא יורשת במחלקה פורם בדומה למה שאנחנו בנינו בפרויקט ה-Consol Application.

  52. 15:59

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

  53. 16:20

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

  54. 16:40

    וכאשר אנחנו בנינו אותם, כל רכיב בנינו כ-Data Member, ונתנו לו כמובן איזשהו שם של האובייקט. זה בדיוק המאפיין name. ה-name של כל אחד מהאובייקטים והשם של ה-data member שהולך להיווצר לנו.

  55. 17:01

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

  56. 17:15

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

  57. 17:26

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

  58. 17:46

    יש לנו את ה-Label הזאת, ניתן לה את השם lbl-last name. יש לנו את תיבת הטקסט הזאת שמיועדת בשביל השם הפרטי וניתן לה את השם txt first name. יש לנו את תיבת הטקסט הזאת וניתן לה את השם txt last name.

  59. 18:11

    שימו לב שכל אחד מרכיבי הטופס שמוצגים עליו הולך להיות data member בתוך הטופס, תכף

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

ההרצאה הקודמת: יוצרים חלון ידני מ-console application

ההרצאה הבאה: רכיבים נפוצים - Common Controls

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

  • Java Project
  • Importing Project
  • פרוייקט מסכם ב-Xcode
  • פרוייקט ראשון ב-MVC

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

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