פורסם 2008 בספטמבר 2117 שנים הנה דרך אחת לעשות את זה:תוסיף ל form שלך את המתודה הבאה: public Dictionary<int, T> getList<T>(string name) where T : class { Dictionary<int, T> ret = new Dictionary<int, T>(); foreach (Control cnt in Controls) { if (cnt.Name.StartsWith(name)) { int index; if (int.TryParse(cnt.Name.Substring(name.Length, cnt.Name.Length - name.Length), out index) && cnt is T) ret[index] = cnt as T; } } return ret; }ואחרי זה תיצור פעם אחת (נגיד ב onLoad או משהו כזה) את המשתנה עם הנתונים:Dictionary<int, Button> btns = getList<Button>("button");ואז תוכל לגשת למשתנה מסויים לפי המספר:MessageBox.Show(btns[2].Text);
פורסם 2008 בספטמבר 2217 שנים מחבר Oם זה בהחלט תשובה שלא ראיתי עד עכשיואפשר רק הסבר קצר על המתודה עצמה? אני מניח שהיא יוצרת מעין מילוןושאלה-למה לא פשוט להשתמש בקטע הזה foreach (Control cnt in Controls) { if (cnt.Name.StartsWith(name)) { int index; if (int.TryParse(cnt.Name.Substring(name.Length, cnt.Name.Length - name.Length), out index) && cnt is T) ret[index] = cnt as T; } }ולהכניס את כולם למערך (כי הכל זה פקדים מאותו סוג)במקום לעשות את המעין מילון הזה?
פורסם 2008 בספטמבר 2217 שנים הפואנטה הייתה מראש ליצור את הפקדים במערך, ולא 82 פקדים שונים שהיית צריך ליצור ידנית.משהו כזה (בתוך הקוד של הטופס):public Form1() { pictureBox[] picBoxArray = new pictureBox[82]; for (int i = 0 ; i < 82 ; ++i) { pictureBox[i] = new PictureBox; pictureBox[i].Top = i*8; pictureBox[i].Left = 100; pictureBox[i].Tag = i; pictureBox[i].Click += new System.EventHandler(this.hitMe); this.Controls.Add(pictureBox[i]); }}private void hitMe(object sender, System.EventArgs e){ PictureBox who = (PictureBox) sender; MessageBox.Show("PictureBox #"+who.Tag.ToString()+" was clicked!");}הלולאה יוצרת את כל 82 הפקדים אחד אחרי השני, ומוסיפה אותם לטופס. חוץ מזה, היא מקשרת בין אירוע הלחיצה על כל פקד לפונקציה hitMe.בשדה ה-Tag של כל פקד, שמים את האינדקס של הפקד, כדי שנוכל לזהות אותו.
פורסם 2008 בספטמבר 2217 שנים Oם זה בהחלט תשובה שלא ראיתי עד עכשיו אפשר רק הסבר קצר על המתודה עצמה? אני מניח שהיא יוצרת מעין מילון ושאלה- למה לא פשוט להשתמש בקטע הזה foreach (Control cnt in Controls) { if (cnt.Name.StartsWith(name)) { int index; if (int.TryParse(cnt.Name.Substring(name.Length, cnt.Name.Length - name.Length), out index) && cnt is T) ret[index] = cnt as T; } } ולהכניס את כולם למערך (כי הכל זה פקדים מאותו סוג) במקום לעשות את המעין מילון הזה? למה מעין ? היא יוצרת מילון באמת. אי אפשר להסתמך על הלולאה הזאת סתם ככה כי יתכן שיצרת אותם לא בסדר הנכון ואז האופציות הם או להכניס אותם לרשימה ולמיין או פשוט להשתמש במילון. כמובן שזאת לא הדרך המומצלת (עדיף את מה ששניצל אמר) אבל אם כבר עשית זה טריק נחמד
פורסם 2008 בספטמבר 2217 שנים הייתי באותו מצב כמוך לפני שנתיים כשבניתי סנייק ב-VB (כל משבצת על הלוח הייתה פקד תמונה).כמו ששניצל אמר - תשתמש במערך פקדים. בVB6 אם היית עושה העתק-הדבק לפקד הוא היה שואל אותך אם ליצור מערך פקדים (ובעצם עושה בכוחות עצמו מה ששניצל אמר לך לעשות), תנסה את הדרך הזאת.
פורסם 2008 בספטמבר 2217 שנים ב-VB6 זה היה מובנה בתוך השפה. ב-.NET אין כזה דבר, ואתה חייב לעשות את זה ידנית (כמו שהראיתי).
פורסם 2008 בספטמבר 2217 שנים מחבר אני שכחתי לגמרי... לכל המתעניינים- השיטה של שניצל (זו שלקראת סוף עמוד 2) היא זו שעובדת הכי טוב לצרכים שלי הייתי צריך קצת לשפר (הייתי צריך לשלוט על עוד פרמטרים של הPB ולהפוך את זה למערך דו מימדי+2 לולאות בשביל ליצור ריבוע) אבל זה עובד
פורסם 2008 בספטמבר 2217 שנים אגב, האם לא ניתן לעשות משהו כזה גם בעזרת reflection? (לא שאני בעד פתרון זוועתי שכזה)
פורסם 2008 בספטמבר 2217 שנים אפשר לעבוד עם reflection, אבל הפתרון של לחפש את כל ה-PictureBox ב-Form.Controls יותר פשוט ואלגנטי (אבל לא פשוט ואלגנטי כמו הפתרון שלי )
פורסם 2008 בספטמבר 2217 שנים יותר פשוט, יותר אלגנטי והרבה יותר בעייתיהבעיה בפיתרון שלך (שניצל) היא שכל התעסקות ידנית עם קובץ ה-design תגרום לבעיות.לא סתם עשו הפרדה מ-.Net 2005 בין הקוד שמיוצר אוטומטית ע"י סביבת הפיתוח לבין הקוד של המשתמש.הבעיה בהתעסקות עם קובץ ה-design היא שכל שינוי בגרפיקה ב-form עלול לגרום ליצירה מחדש של חלקים או כל הקובץ design מה שידרוס את השינויים שלך.בתור קו מנחה כללי לא מומלץ לשנות ידנית את קובץ ה-design.
פורסם 2008 בספטמבר 2217 שנים אני יודע, הכוונה שלי הייתה לעשות את זה בקובץ הרגיל, ולא בקובץ ה-design.את קובץ ה-design הבאתי כדוגמה איך נראה קוד ליצירת פקדים.
פורסם 2008 בספטמבר 2317 שנים אבל אז אתה לא יכול להעזר בעורך הגרפי של ה-form כדי למקם את הרכיבים וכדי לקבוע להם מאפיינים.
פורסם 2008 בספטמבר 2317 שנים אבל אז אתה לא יכול להעזר בעורך הגרפי של ה-form כדי למקם את הרכיבים וכדי לקבוע להם מאפיינים.מצד אחד - נכון. מצד שני, ה-designer נועד למשתמשים "פשוטים", ולא למשתמשים מתקדמים.לדוגמה, הוא לא יכול להתמודד אם מקרים שהמשתמש רוצה לשנות את הגודל של הטופס (גם בשביל זה צריך התעסקות ידנית עם המקומות של הפקדים).
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.