בעייה ב VISUAL C#

איל פורת

New member
מנהל
בעייה ב VISUAL C#

האם יש דרך להפעיל את פרוצדורת CLICK של פקד GROUP BOX ע"י פקד ששייך אליו? הסבר: אני יוצר GROUPBOX ARRAY כאשר בכל GROUPBOX יש כמה פקדים אחרים (LABEL, IMAGE וכו'). לכל GB אני יוצר CLICKHANDLER המזהה את הפקד המתאים ב ARRAY ומפעיל אותו. איני מוצא את הדרך להפעיל את הפקודה הזו מפקדים אחרים - מכיוון שה SENDER מופיע כפקד מסוג אחר (הSENDER יהיה מסוג הפקד עליו לחץ המשתמש). כיצד עווקפים את הבעייה הזו?
 

Justin Angel

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

למרות שהסיטואציה עצמה לא ברורה, עושה רושם שהבעיה העקרונית היא ששייכת את הלחיצה על פקד גם לפקדים המקוננים בתוכו ואתה לא יכול להבדיל בין לחיצה על הפקד האב לבין הפקדים המקוננים. הפתרון הפשוט הוא לא לעבוד מול sender, אלא לחפש את בתוך ההורים של הפקד המקונן את האבא שהוא GroupBox. נעבור ברקורסיה (או לולאה שקולת רקורסיה) על כל הפקדים בהיררכיית ההורים של הפקד שעליו נלחץ עד אשר נמצא אחד מטיפוס GroupBox.
private void GroupBox1_Click(object sender, EventArgs e) { Control mySender = (Control) sender; while (sender.GetType() != typeof(GroupBox)) mySender = mySender.Parent; }​
למרות שהפתרון הזה נכון מבחינה טכנית ועובד, אישית הייתי מעדיף פתרון קצת יותר "נקי" תכנותית. הבעיה כאן לראות עיניי היא שנתנו אחריות על חיפוש האבא של פקד מסויים לטופס עצמו שבכלל לא אמור להתעסק עם האינפורמציה הזו. ספציפית, מפריע לי שהטופס מריץ כאן איזה רקורסיה על פקדים שבכלל היו אמורים לספק בעצמם את האינפורמציה על הפקד האב. אפשרות אחת, ולא הכי נקייה תכנותית, היא להשתמש ב-Control.Tag כדי להכיל תמיד את ה-GroupBox שבתוכו יושב הפקד הנוכחי. היות ואתה יוצר דינמית את הפקדים, זה גם הפתרון הכי קל ליישום מבין הפתרונות היותר "נקיים".
// dynamiclly building controls with Control.Tag GroupBox newGroupBox = new GroupBox(); newGroupBox.Tag = newGroupBox; this.Container.Add(newGroupBox); TextBox newTextBox = new TextBox(); newTextBox.Tag = newGroupBox; newGroupBox.Controls.Add(newTextBox); GroupBox newOtherGroupBox = new GroupBox(); newOtherGroupBox.Tag = newGroupBox; newGroupBox.Controls.Add(newOtherGroupBox); Button newButton = new Button(); newButton.Tag = newGroupBox; newOtherGroupBox.Controls.Add(newButton); // using Control Tag to get masterGroupBox private void Form11_Load(object sender, EventArgs e) { GroupBox mySender = (GroupBox) ((Control) sender).Tag; }​
אפשר לקחת את הפתרון הזה הלאה לירושה של כל הפקדים ומימוש ממשק אחיד שמאפשר להשיג את פקד ה-GroupBox האב.
 
למעלה