קה פרובלמה מואי צ'יקיטה?
למרות שהסיטואציה עצמה לא ברורה, עושה רושם שהבעיה העקרונית היא ששייכת את הלחיצה על פקד גם לפקדים המקוננים בתוכו ואתה לא יכול להבדיל בין לחיצה על הפקד האב לבין הפקדים המקוננים. הפתרון הפשוט הוא לא לעבוד מול 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 האב.