האם בC# אפשר לפנות לשם משתנה בעזרת משתנה אחר? - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


TheReaper

Recommended Posts

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

תוסיף ל 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
  • נוצר
  • תגובה אחרונה

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

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

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

קישור לתוכן
שתף באתרים אחרים

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

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

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

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

קישור לתוכן
שתף באתרים אחרים

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

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

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

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

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

קישור לתוכן
שתף באתרים אחרים

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

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

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

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


×
  • צור חדש...