עבור לתוכן

עזרה ב#C, יצירת FORM עם מספר לא ידוע מראש של אלמנטים

Featured Replies

פורסם

שלום, אני עובד ב #C בVS2003.

יש לי FORM ראשי של האפליקציה, אני פותח עוד חלון קטן ששואל "כמה ניסיונות אתה מעוניין לבצע?" ולפי המספר שהמשתמש מכניס אני אמור ליצור

מספר של כפתורים על ה- FORM .

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

תודה מראש.

פורסם

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

איך הכפתורים צריכים להיות מסודרים בחלון?

בסה"כ זאת משימה פשוטה לביצוע, אך דרושים מעט יותר פרטים, כמו איך הכפתורים יהיו מסודרים בחלון, האם לכולם אותו event handler ללחיצה וכו', כדאי שנוכל לתת לך את הפתרון המדוייק.

פורסם
  • מחבר

בעיקרון הבעייה היא בראשון, אני לא יודע איך ליצור את הכפתורים בצורה דינמית, לאחר מכן לא אמורה להיות העברת מידע ביניהם אלא ביניהם לבין רכיבים אחרים.

אם תוכל לעיין בתרגיל עצמו, תבין יותר טוב ממה שאני אצליח להסביר...

תודה!

[attachment deleted by admin]

פורסם

תראה בעיקרון הקוד לא הכי נקי, ואפשר אולי לייעל אותו אבל זה הבסיס:

יצרתי מחלקה עבור הפאנל עם ה-4 פנלים הקטנים:

  class AnswerPanel : Panel
{
private Panel[] _subPanels;

public AnswerPanel(Size size, int x, int y, int innerSpace)
{
Size subPanelSize = new Size((size.Width - innerSpace * 3 - 2)/2, (size.Height - innerSpace * 3 - 2)/2);

_subPanels = new Panel[4];
_subPanels[0] = CreateSubPanel(subPanelSize, innerSpace, innerSpace);
_subPanels[1] = CreateSubPanel(subPanelSize, size.Width - innerSpace - subPanelSize.Width, innerSpace);
_subPanels[2] = CreateSubPanel(subPanelSize, innerSpace, size.Height - innerSpace - subPanelSize.Height);
_subPanels[3] = CreateSubPanel(subPanelSize, _subPanels[1].Left, _subPanels[2].Top);

this.SuspendLayout();
this.Controls.AddRange(_subPanels);
this.Size = size;
this.Location = new Point(x, y);
this.BorderStyle = BorderStyle.FixedSingle;
this.ResumeLayout(true);
}

private Panel CreateSubPanel(Size size, int x, int y)
{
Panel tmp = new Panel();
tmp.Size = size;
tmp.Location = new Point(x, y);
tmp.BorderStyle = BorderStyle.FixedSingle;
return tmp;
}

public void MarkGuess(bool[] guesses)
{
for (int i = 0; i < guesses.Length; i++)
if (guesses[i])
_subPanels[i].BackColor = Color.Black;
}
}

זה הקוד של הטופס הראשית:

  public partial class Form1 : Form
private int _numOfGuesses = 5; //holds the number entered by the user
private Button[,] _btnGuesses;
private AnswerPanel[] _pnlAnswers;
private Button[] _btnMarkAnswers;
...

private void CreateControls()
{
//Layout data
int startX = 15;
int startY = 40;
int spaceBetweenLines = 5;
int spaceBetweenControls = 10;
int panelInnerSpace = 2;
Size guessBtnSize = new Size(30, 30);
Size markAnswerBtnSize = new Size(30, 20);
int xpos, ypos = startY;
int markAnswerYAddition = guessBtnSize.Height / 2 - markAnswerBtnSize.Height / 2;

EventHandler ehGuessClick = new EventHandler(GuessButtons_Click);
EventHandler ehMarkAnswersClick = new EventHandler(MarkAnswerButtons_Click);

_btnGuesses = new Button[_numOfGuesses, 4];
_pnlAnswers = new AnswerPanel[_numOfGuesses];
_btnMarkAnswers = new Button[_numOfGuesses];

SuspendLayout();
int i,j;
for (i = 0; i < _numOfGuesses; i++)
{
xpos = startX;
for (j = 0; j < 4; j++)
{
//user guesses buttons
_btnGuesses[i, j] = CrateButton(string.Concat("_btnGuesses_", i.ToString(), j.ToString()),
"",
xpos,
ypos,
guessBtnSize,
ehGuessClick);
Controls.Add(_btnGuesses[i, j]);
xpos += guessBtnSize.Width + spaceBetweenControls;
}

//the "Check Answer" button
_btnMarkAnswers[i] = CrateButton(string.Concat("_btnMarkAnswers", i.ToString()),
"->",
xpos,
ypos + markAnswerYAddition,
markAnswerBtnSize,
ehMarkAnswersClick);
Controls.Add(_btnMarkAnswers[i]);

//the answer panel with the 4 sub-panels
xpos += guessBtnSize.Width + spaceBetweenControls;
_pnlAnswers[i] = new AnswerPanel(guessBtnSize, xpos, ypos, panelInnerSpace);
Controls.Add(_pnlAnswers[i]);

ypos += guessBtnSize.Height + spaceBetweenLines;
}

ResumeLayout(true);
}

//Create new Button object
private Button CrateButton(string name, string text,int x, int y, Size size, EventHandler clickEH)
{
Button btn = new Button();
btn.Name = name;
btn.Size = size;
btn.Location = new Point(x, y);
btn.Click += clickEH;
btn.Text = text;

return btn;
}

private void GuessButtons_Click(object sender, EventArgs e)
{
//open the color selection form
//cast the sender to button and change its BackColor
}

private void MarkAnswerButtons_Click(object sender, EventArgs e)
{

}
}

אני פשוט חייב לזוז, אם תצטרך עזרה / הסבר נוספים אני אשמח לעזור לך מאוחר יותר כשאחזור הביתה.

פורסם
  • מחבר

תודה רבה!! עוד לא יצא לי לעבור על זה.. בתקווה שאני לא אצטרך עוד עזרה...

ארכיון

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

דיונים חדשים