עבור לתוכן

האם בC# אפשר לפנות לשם משתנה בעזרת משתנה אחר?

Featured Replies

פורסם

הנה דרך אחת לעשות את זה:

תוסיף ל 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);

  • תגובות 36
  • צפיות 3.8k
  • נוצר
  • תגובה אחרונה

משתתפים בולטים בדיון

פורסם
  • מחבר

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;
}
}

ולהכניס את כולם למערך (כי הכל זה פקדים מאותו סוג)

במקום לעשות את המעין מילון הזה?

פורסם

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

פורסם

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;
}
}

ולהכניס את כולם למערך (כי הכל זה פקדים מאותו סוג)

במקום לעשות את המעין מילון הזה?

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

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

פורסם

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

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

פורסם

ב-VB6 זה היה מובנה בתוך השפה. ב-.NET אין כזה דבר, ואתה חייב לעשות את זה ידנית (כמו שהראיתי).

פורסם
  • מחבר

אני שכחתי לגמרי...

לכל המתעניינים- השיטה של שניצל (זו שלקראת סוף עמוד 2) היא זו שעובדת הכי טוב לצרכים שלי

הייתי צריך קצת לשפר (הייתי צריך לשלוט על עוד פרמטרים של הPB ולהפוך את זה למערך דו מימדי+2 לולאות בשביל ליצור ריבוע)

אבל זה עובד :xyxthumbs:

פורסם

אגב, האם לא ניתן לעשות משהו כזה גם בעזרת reflection? (לא שאני בעד פתרון זוועתי שכזה)

פורסם

לא רואה סיבה שלא, אבל הביצועים יהיו הרבה יותר גרועים.

פורסם

אפשר לעבוד עם reflection, אבל הפתרון של לחפש את כל ה-PictureBox ב-Form.Controls יותר פשוט ואלגנטי (אבל לא פשוט ואלגנטי כמו הפתרון שלי :) )

פורסם

יותר פשוט, יותר אלגנטי והרבה יותר בעייתי

הבעיה בפיתרון שלך (שניצל) היא שכל התעסקות ידנית עם קובץ ה-design תגרום לבעיות.

לא סתם עשו הפרדה מ-.Net 2005 בין הקוד שמיוצר אוטומטית ע"י סביבת הפיתוח לבין הקוד של המשתמש.

הבעיה בהתעסקות עם קובץ ה-design היא שכל שינוי בגרפיקה ב-form עלול לגרום ליצירה מחדש של חלקים או כל הקובץ design מה שידרוס את השינויים שלך.

בתור קו מנחה כללי לא מומלץ לשנות ידנית את קובץ ה-design.

פורסם

אני יודע, הכוונה שלי הייתה לעשות את זה בקובץ הרגיל, ולא בקובץ ה-design.

את קובץ ה-design הבאתי כדוגמה איך נראה קוד ליצירת פקדים.

פורסם

אבל אז אתה לא יכול להעזר בעורך הגרפי של ה-form כדי למקם את הרכיבים וכדי לקבוע להם מאפיינים.

פורסם
  • מחבר

אפשר לקבוע את המאפיינים שלהם בעזרת פנייה לפרמטר

פורסם

אבל אז אתה לא יכול להעזר בעורך הגרפי של ה-form כדי למקם את הרכיבים וכדי לקבוע להם מאפיינים.

מצד אחד - נכון. מצד שני, ה-designer נועד למשתמשים "פשוטים", ולא למשתמשים מתקדמים.

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

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים