Question from Tapuz .Net forum: How can I access controls inside Custom/User Controls if they haven't been created at Page_Load?
שאלה:
יש לי User Control שמכיל DropDownList, ויש לי דף שמכיל אותו.
שמתי לב שה Page_Load של המסך רץ לפני ה Page_Load של הקונטרול,
לכן אני לא יכול לאתחל את הקונטרול ב Page_Load של המסך, אלא רק בשלב מאוחר יותר,
למשל OnPreRender של המסך.
האם הבנתי נכון, וכך עושים זאת ?
תשובה:
הבנת נכון את רצף האירועים. Page מבצע ראשון את כל האירועים שלו, ואז כל מיני סוגי דפים אחרים שקשורים אליו (UserControls ו-MasterPages) מריצים את האירועים שלהם. לא ברור לי מה הכוונה ב"לאתחל את הקונטרול", ה-UserControl נוצר כמו כל פקד אחר שהוספת באמצעות ה-Designer לפני ה-Page_load ולכן כבר מאותחל.
אם למשל אתה מתכוון שאתה לא יכול לגשת לפקדים הפנימיים של UserControl בשלב ה-Page_load של הדף שמכיל אותו, בזה אתה צודק. אתה אמור לקבל על זה שגיאה כי באמת הפקדים בפנים לא מאותחלים. במצבים מאוד פשוטים כאלו, אתה לא תקבל את השגיאה הזו כי איפהשהו מתבצעת אופטימיזציה שקולטת "איזה טיפש התוכניתן, הוא מנסה לגשת לפקד שלא קיים, אני אצור את הפקדים בפנים קודם". האופטימזיציה הזאת מושלמת להדגמות מול קהל ומפסיקה לעבוד ברגע שהדף מספיק מסובך (ע"ע Real world).
כ-כלל אצבע, מה שעושים במצבים כאלו שרוצים לגשת לפקדים של Custom Control או User Control שיתכן שקיימים ויתכן שאינם קיימים הם לדאוג שהפקדים קיימים. בתוך כל Property שאתה חושף לפני שאתה ניגש לפקדים עצמם תצטרך לקרוא למתודה EnsureControlsCreated. זאת מתודה שנמצאת בשימוש נרחב בכל מקום שבו כותבים פקדים באמת כדי לוודא שקיימים פקדים לפני שניגשים אליהם מתוך Properties למיניהן שאינן קשורות בישירין לסדר האירועים הדיפולטי של הדף.
יש דוגמה לזה בשאלה על MasterPages של אוהד מלפני שבוע.
public string HeadlineText
{
get
{
EnsureChildControls();
return lblHeadline.Text;
}
set
{
EnsureChildControls();
lblHeadline.Text = value;
}
}
קישור: http://www.tapuz.co.il/tapuzforum/main/Viewmsg.asp?forum=831&msgid=87714586