C # Добавить элементы управления на панель в цикле - PullRequest
7 голосов
/ 20 июня 2011

Я хочу добавить кнопку для каждой строки в файле на панель. Мой код на данный момент:

StreamReader menu = new StreamReader("menu.prefs");
int repetition = 0;

while(!menu.EndOfStream)
{
    Button dynamicbutton = new Button();
    dynamicbutton.Click += new System.EventHandler(menuItem_Click);
    dynamicbutton.Text = menu.ReadLine();
    dynamicbutton.Visible = true;
    dynamicbutton.Location = new Point(4+repetition*307, 4);
    dynamicbutton.Height = 44;
    dynamicbutton.Width = 203;
    dynamicbutton.BackColor = Color.FromArgb(40,40,40);
    dynamicbutton.ForeColor = Color.White;
    dynamicbutton.Font = new Font("Lucida Console", 16);
    dynamicbutton.Show();
    menuPanel.Controls.Add(dynamicbutton);
    repetition++;
    MessageBox.Show(dynamicbutton.Location.ToString());
}
menu.Close();

Проблема в том, что создается только первый элемент управления.

Ответы [ 6 ]

9 голосов
/ 20 июня 2011

Код выглядит нормально, но возможны следующие ситуации.

1.В файле может быть только одна запись, поэтому к панели добавляется только одна кнопка.

2. Ширина вашей панели меньше суммы всех динамических кнопок.

Я подозреваю, что нет 2 - главная причина, которая вызывает проблему.

Итак, я рекомендую вам использовать FlowLayoutPanel . Чтобы добавить динамический контент, поскольку он автоматически размещает все дочерние элементы управления.

3 голосов
/ 14 апреля 2012

Каждый раз он генерирует одно и то же имя для динамических элементов управления.Вот почему он показывает только последний.Он просто перезаписывает предыдущий элемент управления каждый раз.

2 голосов
/ 30 августа 2015
int x = 4;
int y = 4;
foreach(PhysicianData pd in listPhysicians)
{
   x = 4;
   y = panPhysicians.Controls.Count * 30;
   RadioButton rb = new RadioButton();
   rb.CheckedChanged += new System.EventHandler(rbPhysician_CheckedChanged);
   rb.Text = pd.name;
   rb.Visible = true;
   rb.Location = new Point(x, y);
   rb.Height = 40;
   rb.Width = 200;
   rb.BackColor = SystemColors.Control;
   rb.ForeColor = Color.Black;
   rb.Font = new Font("Microsoft Sans Serif", 10);
   rb.Show();
   rb.Name = "rb" + panPhysicians.Controls.Count;
   panPhysicians.Controls.Add(rb);
}
0 голосов
/ 03 марта 2014

У меня тоже есть похожие проблемы с панелями. Для того, что вы делаете, может быть полезно просто добавить строки в список, а не использовать метки и панель. Это должно быть проще.

0 голосов
/ 18 апреля 2012

Проблема с Panel и аналогичными элементами управления, отличными от FlowLayoutPanel, заключается в том, что когда вы создаете второй элемент управления, второй создается в той же позиции, если вы не меняете его местоположение динамически или устанавливаете его в соответствии с другим уже добавленным элементом. управления. Ваш контроль есть, он находится позади первого элемента управления.

FlowLayoutPanel лучше, так как он добавляет элементы управления рядом друг с другом, когда вы добавляете их, в то же время подвергая риску более тонкий элемент управления при их позиционировании.

0 голосов
/ 20 июня 2011

Попробуйте этот код

        StreamReader menu = new StreamReader("menu.prefs");
        var str = menu.ReadToEnd();
        var items = str.Split(new string[] {"\r\n" } , StringSplitOptions.RemoveEmptyEntries);
        foreach (var item in items)
        {
           Button dynamicbutton = new Button();
           dynamicbutton.Click += new System.EventHandler(menuItem_Click);
           dynamicbutton.Text = item;
           dynamicbutton.Visible = true;
           dynamicbutton.Location = new Point(4+repetition*307, 4);
           dynamicbutton.Height = 44;
           dynamicbutton.Width = 203;
           dynamicbutton.BackColor = Color.FromArgb(40,40,40);
           dynamicbutton.ForeColor = Color.White;
           dynamicbutton.Font = new Font("Lucida Console", 16);
           dynamicbutton.Show();
           menuPanel.Controls.Add(dynamicbutton);
           repetition++;
        }
...