C# добавление элементов управления на панель в цикле

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

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 ответов


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

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

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

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

Итак, я рекомендую вам использовать FlowLayoutPanel. Добавление динамического содержимого в виде автоматическое расположение всех дочерних элементов управления.


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


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

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

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

проблема с панелью и аналогичными органами управления, кроме управления flowlayoutpanel, это когда вы создаете контроль и второй, второй создается на той же позиции, если вы не меняете его местоположение динамически или по другим уже добавлены новые элементы управления. Это есть, это в первый контроль.

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


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