פקדי משתמש

mnmaster

New member
פקדי משתמש

שלום. העליתי פה שאלה לפני יומיים אבל היא ירדה מהר לעמוד השני אז אני מעלה אותה שוב האם ניתן לבצע הוספת פקד-משתמש דרך ה- code behind? הצלחתי להכניס פקד רגיל (לייבל) אבל פקד משתמש שכתבתי - לא אני מתכוון לבצע זאת באמצעות השיטה הבאה
Panel1.controls.add()​
נעניתי על ידי אורן עיני: "אתה יכול לעשות את זה, אבל אתה לא יכול לגשת ישירות לקונטרול שלך, אתה צריך להעלות אותו באמצעות LoadControl קודם." ועניתי לו בחזרה ש- "ראשית, אני לא הצלחתי לעשות את זה. יצרתי אובייקט מסוג הקונטרול שלי ודחפתי אותו לפאנל. זה הוציא שגיאה (שלא בהישג ידי כרגע) בזמן הריצה מה זה LoadControl? איך אני משתמש בו?" בקיצור - הבעיה עדיין לא נפתרה (למרות שהצלחתי להשתמש ב load control) השגיאה שאני מקבל היא: Object reference not set to an instance of an object. והשורה הבעייתית היא שורה 67
Line 65: private void InitializeComponent() Line 66: { Line 67: this.Edit.Click += new System.EventHandler(this.Edit_Click); Line 68: this.Load += new System.EventHandler(this.Page_Load);​
זה כמובן קוד שהויז'ואל סטודיו (2003) מייצר (לא הבנתי בשביל מה) הקוד שבאמצעותו אני מכניס את הפקד משתמש שלי הוא:
UserProfileView upv = new UserProfileView(); upv.UserID = 1; Panel1.Controls.Add(upv);​
אני יודע שהאובייקט כן מאותחל ואפשר להשתמש בו לדרכים אחרות (למשל, להציב את הערך שהכנסתי לו לפקד אחר)
 

Justin Angel

New member
קה פרובלמה מואי צ'יקיטה?

בגדול, הקוד שכתבת מתאים ל-Custom Control. שזה פקד שכל הקוד שלו נכתב אך ורק ב-Code Behind והוא מחלקה בלי קובץ עיצוב. אם מדובר על User control שזה פקד עם תצוגת עיצוב, תצטרך אכן להשתמש ב-LoadControl כדי לטעון אותו. הסיבה להבדלים הוא שאם קיים קובץ עיצובי (ascx) לא בהכרח שקיימת מחלקה מתאימה שניתן לאתחל עם new. צריך להבין כאן את מודל הקומפילציה של דוט נט, כברירת מחדל דפים ו-User controls אינם מתקמפלים אלא אם כן ניגשים אליהם. ולכן, אם תאתחל באמצעות new בלי לדאוג קודם שהם יתקמפלו, סביר להניח שלא קיימת מחלקה שבאמת ניתן לאתחל. ובהתאם, עובדים עם LoadControl שמקבל נתיב לקובץ ascx ודואג לקמפל את כל הפקד למחלקה וגם מחזיר מופע שלה.
myUserControl uc = (myUserControl) this.LoadControl("~\myUserControl.ascx");​
 

mnmaster

New member
תותח אתה...

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

Justin Angel

New member
קה פרובלמה מואי צ'יקיטה?

תודה רבה. "הקוד הזה", כפי שקראת לו, הוא הפקדים שלך. זה שאנחנו לוקחים ציורים יפים מה-Toolbox וזורקים אותם על מסמכים עם רקע לבן זה הכל טוב ויפה, אבל אין לו שום תפיסה ואחיזה בעולם שהוא Object-oriented. תמיד תזכור שהכל בסופו של דבר הוא מחלקה מטיפוס כלשהו. זה שאתה לקחת פקד TextBox וזרקת על הטופס בפועל אומר שמישהו איפהשהו צריך ליצור מופע של TextBox, לקבוע לה ID ייחודי, ולהוסיף אותה למערך הפקדים של הטופס. ה-Designer שומר את הקוד שלו בנפרד היות והוא יודע לכתוב פורמט מאוד ספציפי ולקרוא פורמט מאוד ספציפי. כלומר, ברגע שזרקת פקד על הטופס (לשמל TextBox) הוא באמת יכתוב את שלושת הפעולות שתיארנו. אבל כדי שהוא יוכל עוד פעם לפתוח את הקוד (הרי בשום מקום לא נשמר הציור היפה שאנחנו רואים) ולהבין איך לצייר מחדש את הטופס בשבילך הוא צריך את הקוד הזה. זה הקוד היחידי שה-Designer שלנו יודע לקרוא ולפענח לציור שאנחנו רגילים לראות. אין כזה דבר הבדלים תמציתיים בין דוט נט 2.0 לדוט נט 1.1, כמות ההבדלים היא אסטרונומית. הן מבחינת כלי עבודה והחבילת מוצרים הכללית שיש איתה אינטגרציה, הן מבחינת המחלקות בפועל שנחשפות למשתמש (במקום 4,000~ מחלקות ציבוריות בפריימוורק יש 11,079 מחלקות ציבוריות וזה הבדל ענק), הן מבחינת תמיכה קהילתית ומסמכים שזמינים והן מכל בחינה של התקדמות טכנולוגית מול קפיאה טכנולוגית על השמרים. היום הפוקוס הקהילתי, הכספי והארגוני מוסט לכיוון דוט נט 2.0 ולכן הוא הרבה יותר טוב.
 

mnmaster

New member
עוד שאלה

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

Justin Angel

New member
קה פרובלמה מואי צ'יקיטה?

הקוד הזה משמש את ה-Designer, אך הוא גם קוד שאותה האפליקציה מריצה. הרי אם גררת פקד על הטופס העובדה שיש ציור יפה מולנו לא אומרת לקומפיילר איזה מחלקה הוא אמור להוסיף למחלקת הדף שלנו. תחשוב על זה ככה, שאיכשהו גם מנוע ה-ASP.Net\Winforms צריך לדעת מה לשים ואיך לשים, והקוד שמייצר ה-Designer אלו הן ההוראות האלו. בהתאם לשאלה שלך, כן זה הקוד שרץ בשרת אם מדובר ב-ASP.Net או בלקוח עם מדובר באפליקצית Winforms. אם תמחוק את קוד ה-Designer כל מה שכתוב בתוכו לא יתבצע. גם אם לא עבדת עם פקדים יש קישור לאירועים כלליים (למשל Page.Load), אתחול של אוספים, אתחול של תרבות האתר וייתכן עוד קוד נוסף. באם תמחוק את הקוד תאבד את אותם יכולות והקוד שלך סביר להניח לא יתקמפל ולא יתבצע כיאות. למשל הקישור הבסיסי ל-Page_load מתבצע מתוך ה-Designer ואם אין את שורת האירוע שמקשרת בין אירוע Load של הדף לבין המתודה הזו, ייתכן והיא לא תיטען. בנוסף, אם תמחק את קוד ה-designer תאבד כל תמיכה ב-designer ותקבל שלל שגיאות מעניינות שתנסה לפתוח אותו ואף לקמפל.
 

mnmaster

New member
תודה. ועוד קטנה...

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

בתנאי שתשמור על אותה תבנית כמו של הDesigner (לא דוקה באותו הסדר, אבל באותו התוכן). בכל מקרה אם אתה עושה את זה אז כבר עדיף שפשוט תשאיר את הקוד על כנו. לצרכך, פשוט תשאיר את הקוד של הDesigner כמו שהו, ואת הכל הוספות האובייקטים תעשה דרך הקוד שלך. למחוק את הקוד לחלוטין לא מומלץ - עיין בתגובה של ג'סטין. נ.ב. Develop# אכן מביא את הקוד של הdesigner כחלק מ"קוד המשתמש" ולא כקובץ נפרד.
 

mnmaster

New member
הבנתי את הפרנציפ

אני שואל כי אני רוצה להבין את העקרון. אני לא אוהב את זה שה VS שותל קוד שאני לא מבין אותו. אחרי שאני אבין - שישתול מה שבא לו :)
 
למעלה