dynamic userControl

e y a l b

New member
dynamic userControl

יש לי כפתור שמוסיף UC לplaceHolder בדף מסויים אם יש POSTBACK אז ה UC נעלם. איך אני גורם לו להישאר בדף?
 

Justin Angel

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

כל פקד שאתה מוסיף לדף באופן דינמי צריך להוסיף לדף בכל PostBack ו-PostBack. בין אם זה פקד WebControl, פקד HtmlControl, פקד Composite Control או פקד User Control. למשל הדוגמה הבאה בה נוסיף רק בטעינת הטופס Label עם המילים Hello world תופיע רק בטעינת הדף, אבל כאשר נלחץ על כפתור באותו הדף ונבצע PostBack היא לא תופיע שנית.
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Label myLabel = new Label(); myLabel.Text = "Hello world"; this.Page.Controls.Add(myLabel); } }​
את הפקד אתה יוצר מחדש בשלב הכי מוקדם שאתה יכול, ומתישהו הערכים השונים שחוזרים מ-ViewState ו-PostBack נטענים לתוכו ומחזירים לו את ה-State שלו.
 

Justin Angel

New member
../images/Emo26.gif

זה המצב הברירת מחדל. יש למען האמת שני סבבים של טעינת ViewState ו-PostBack במחזור חיי הדף, אחד אחרי ה-PreLoad ואחד אחרי ה-EndLoad לפני ה-LoadComplete. דרך אותו מנגנון שמבצע פעמיים את טעינת ה-PostBack ו-ViewState ניתן דרך ירושה של System.Web.UI.Page להוסיף סבבים של טעינת PostBack וטעינת ושמירת ViewState. למשל, לאחר PreRender.
 
בקשת הבהרה

לגבי ה- ViewState עד כמה שאני יודע למעשה אין "סבב", אלא ברגע שמוסיפים קונטרול לקונטיינר שלו, מתווסף לו ה- viewstate באופן אוטומטי (החל מאחרי ה- Init ועד ל- Render). אשמח לדעת כיצב בדיוק ניתן להוסיף סבב נוסך של טעינת PostBack.
 

Justin Angel

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

תביט בריפלקטור על מתודת System.Web.UI.Page.ProcessRequestMain(bool bool). זו המתודה שבפועל אפשר ממש לקרוא בה את ה-Page Life cycle של הדף. אם נרצה להתערב באורח החיים של הדף ניתן להשתמש באותן מתודות\טכניקות שהמתודה הזו משתמשת בתוך מתודות אחרים. הבעיה העקרונית היא שרוב מה שמתבצע שם הוא Private או Internal אז הולכים קצת על קליפות ביצים וחלק צריך ממש להעתיק לתוך המימוש שלך, אבל זה אפשרי. פעם אחרונה שעשיתי את זה היה לגרום ל-ViewState להיטען בזה שהעתקתי חצי מהמתודות שלהם לתוך ה-BasePage שלי, דרסתי את מתודת OnPreRender ולפני הקריאה ל-Base.OnPreRender קראתי ל-System.Web.UI.Page.LoadAllState (שהיא מתודה פרטית ולכן ההעתקות).
 
למעלה