none
שינוי בcustom control לאחר שהוא כבר נוסף למסכים אחרים

    שאלה

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

    אני משערת שזה בגלל שהפונקציה InitializeComponent() נקראת בCTOR, אבל אני לא יודעת איך נכון לפתור את הבעיה הזו.

    תודה לעוזרים מראש.
    יום שלישי 25 יולי 2017 11:51

כל התגובות

  • לא הבנתי.

    את משנה אותם בזמן הריצה או בזמן העיצוב?

    באיזו טכנולוגיה את משתמשת? (ע"פ הזכרתך את ()InitializeComponet אני משער שהכוונה לטכנולוגיית Windows Forms).

    יום שלישי 25 יולי 2017 13:56
  • אני כותבת בC# WIN.

    יצרתי custom control, לצורך הענין:

    public class MyButton : Button

    מיקמתי אותו במסך אחר, form1.

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

    הבעיה שהשינוי לא התעדכן בתצוגה של המסך.

    מה עושים?

    יום רביעי 26 יולי 2017 04:31
  • לא ענית לי על השאלה - מדובר בזמן העיצוב או בזמן הריצה? (זמן העיצוב - שינוי ב-VS, זמן הריצה - שינוי בקוד).

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

    יום רביעי 26 יולי 2017 10:48
  • אני מניח שאת צריכה לשנות את המאפיינים של האלמנטים בזמן הריצה (אחרת זה פשוט שינוי בקוד).

    את צריכה להכין event במחלקה שלך שמטפל באירוע וככה לשלוט על המאפיינים של האלמנטים בזמן שהאירוע (למשל לחיצה על העכבר) קורה. 

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


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]

    יום חמישי 27 יולי 2017 02:58
    מנחה דיון
  • חיים ורונן בוקר טוב, (מ6 אתה על הרגליים, אה?)

    התכוונתי לזמן העיצוב. השינוי לא נראה לא בזמן בעיצוב ולא בזמן הריצה.

    רונן, אם אני עושה אירוע, כמובן שזה משתנה.

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

    אני רוצה שאוכל להשתמש בdesign של form1, ולעצב את הכפתורים שם.

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

    שיניתי בכפתור הבסיס custom control, עשיתי build ו rebuild, והשינוי היחיד מורגש בכפתורים העתידיים שאני אוסיף למסך ולא באלו הקיימים.

    =====

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

    וגם שחשבתי שאעשה שימוש פונקציונאלי בהם.

    אבל בתכלס, אם אני משתמשת בcustom control רק כדי שאוכל לשנות עיצובים, האם יש דרך אחרת יותר יעילה לעשות את זה?


    יום חמישי 27 יולי 2017 04:39
  • לגבי השאלה השנייה, אולי תחשבי לעבור ל-WPF, שם יש סגנונות בדיוק כדי לפתור את הבעיה הזו...

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

    לדוגמה, יצרתי תיבת טקסט שמתחילה באופן אוטומטי עם הטקסט "Please enter yout text here":

    public class CustomTextbox : System.Windows.Forms.Textbox
    {
        public CustomTextbox()
        {
            this.Text = "Please enter your text here";
        }
    }

    כדי להשתמש בה, צריך סה"כ ליצור מופע ממנה ולהוסיפו לאוסף פקדי הטופס - כמו פקד משתמש, או באמצעות VS ממש כמו פקדי משתמש.

    לגבי השאלה הראשונה, לא היה לי מושג, אז חיפשתי בגוגל, ומה שמצאתי זה (ב-StackOverflow, חייבים להכיר את האתר הזה) ומסתבר שהבעיה היא מפורסמת, ואף נשלחה לצוות VS. הבעיה אינה בשפת #C, אלא ב-VS. ה-VS לא מעדכן את תיבת הכלים לגרסה החדשה של הפקד. כלומר, כשאתה מוסיף הפניה לפקד היא נשמרת בנפרד מהפקד המקורי. לעתים ניתן להסתמך על ההגדרה Auto toolbox populate ב-VS שנמצאת תחת  Tools > Options > Windows Forms Designer > General, שמוסיפה ללמעלה של ארגז הכלים את כל פקדי המשתמש בפרויקטים הטעונים, לעתים צריך להסיר ולהוסיף מחדש את ההפניה לפקד המשתמש, ולעתים גם זה לא עוזר וצריך לעשות פעולות אחרות.

    את יכולה לבדוק את התשובות לשאלה בכתובת הבאה: https://stackoverflow.com/questions/3759253/vs2010-winforms-usercontrol-changes-not-showing-in-parent-form.

    • נערך על-ידי חיים2 יום חמישי 27 יולי 2017 14:36
    יום חמישי 27 יולי 2017 13:17
  • חיים ורונן בוקר טוב, (מ6 אתה על הרגליים, אה?)

    התכוונתי לזמן העיצוב. השינוי לא נראה לא בזמן בעיצוב ולא בזמן הריצה.

    רונן, אם אני עושה אירוע, כמובן שזה משתנה.

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

    אני רוצה שאוכל להשתמש בdesign של form1, ולעצב את הכפתורים שם.

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

    שיניתי בכפתור הבסיס custom control, עשיתי build ו rebuild, והשינוי היחיד מורגש בכפתורים העתידיים שאני אוסיף למסך ולא באלו הקיימים.

    =====

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

    וגם שחשבתי שאעשה שימוש פונקציונאלי בהם.

    אבל בתכלס, אם אני משתמשת בcustom control רק כדי שאוכל לשנות עיצובים, האם יש דרך אחרת יותר יעילה לעשות את זה?


    היי

    >> שיניתי בכפתור הבסיס custom control, עשיתי build ו rebuild, והשינוי היחיד מורגש בכפתורים העתידיים

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

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

    דוגמה מלאה ליצירת קונטרול ושליטה עליו:

    1. פרוייקט win forms חדש
    2. הוסיפי item מסוג user control בשם yesNoUC
    3. הוסיפי לקונטרול שלך כפתור בשם YesyNo_Btn
    הוסיפי לקונטרול כם label בשם YesNo_Lbl
    4. הוסיפי אירוע לחיצה על הכפתור בתוך הקונטרול והוסיפי קוד למשל של שינוי הטקסט
    5. חיזרי לטופס המרכזי שלך והוסיפי כמה מופעים של הקונטרול שיצרת על גבי הטופס המרכזי
    6. זמן לשלוט על מופע בוסס:

    6.1 פתחי את הקובת של המחלקה של הטופס שלך (בברירת המחדל השם Form1)
    6.2 הוספי מתחת לשורת הקוד: InitializeComponent();
    את הקוד ששולט במופעי מסויים של קונטרול שלך, למשל הנה נשה את הצבע של הכפתור בקונטרול מסויים:

    namespace YesNoProj
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                //  המתחת מופיע השורה המעניינת שמשנה את הצבע של כפתור בתוך מופע מסויים של וקנטרול שלך
                yesNoUC1.YesyNo_Btn.BackColor = Color.Red;
            }
            
        }
    }

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

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

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

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

    בעקרון כל הקונטרולים יורשים מחלקה של UserControl הכוללת כבר בצורה מובנית (ירושה) כמה עשרות אירועים וכמה עשרות מתודותת אליהם את יכולה כמובן להודיף את האירועים והמתודות שלך.

    >> אבל בתכלס, אם אני משתמשת בcustom control רק כדי שאוכל לשנות עיצובים, האם יש דרך אחרת יותר יעילה לעשות את זה?

    בלי שהבנתי בדיוק את השאלה התשובה היא כן, מכיין שתמיד יש דרך נוספת :-)

    אני לא רואה סיבה לעבור ל WPF ואין בעיה לממש שינויים בתכנות קונטרול בכל סוג תבנית של פרוייקט. יותר מכך! מדובר רקבתבניות של פרוייקטים ואפשרלבצע הכל (עם משועמממים) בעזרת תבנית ריקה, אפשר כם לקחת תבנית של פרוייקט winforms ו"להפוך אותו" לאפליקצייה שמתנהגת כמו WPF עם כל המשתמע מכך. מדובר בסך הכל בתבניות מוכנות מראש שקיימות ב VS על מנת להקל ולקצר בצורה משמעותית את זמן הפיתוח

    ** העברתי הרצאה בדיוק בנושא זה במשרדי מייקרוסופט בקבוצה המשתמשים Dot.Net שמייקרוסופט לפני כמה שנים. כל החומרים של ההרצאה כולל דוגמאות קוד ניתנים להורדה ישירות מהאתר של מייקרוסופט technet gallery. בהדגמה שבוצעה ב live הראתי כיצד אני לקוח פרוייקט מתבנית אחת ומוסיף לו את כל מה שחסר מתבנית שנייה (התחלתי עם תבנית אפליקציית קונסול וסיימתי עם אפליקציה שמפעילה טפסים של Windows forms ועוד כמה הכל תחת פרוייקט בודד)

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

    כולם מוזמנים להצתרף להרצאה!
    זה כמובן הזדמנות "סתם" להכיר ולהגיד שלום :-)

    נחזור לבעיה כפי שאני מבין אותה:

    הרעיוןל של שימוש ב user control הוא כמו שכתבת לחסוך בזמן. הרעיון הוא חיסכון בזמן יציר החלק המשותף, אבל אם אין חלק משותף וכל קונטרול הוא למשל רק שימוש בכפתור ואזאת צריכה לעצב כל כפתור בנפרס אז כבר עדיף שימוש הקונטרול כפתור המובנה ישירות (בדרך כלל). אבל נניח כמו בדוגמה שהזכרתי מעל אני יוצר קונטרול מורכב שבנוי מ 2 קונטרולים מוכנים (button and label) או כולל עשרות קונטרולים מובנים, והוא כולל אירועים וקוד שצריך להפעיל בכל המופעים ואנחנו צריכים 10 מופעים של מה שיש לנו בתוך ה user control אז כמובן ששימוש ב user control הוא הפתרון

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

    ** מה שחיים תיאר לגבי WPF זה בדיוק מה שעושים גם ב winforms וזה בדיוק כמו שימוש בקונטרולים המובנים :-)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]

    יום שישי 28 יולי 2017 06:55
    מנחה דיון