it-roy-ru.com

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

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

7
YoshieMaster

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

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

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

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

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

9
crypted

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

3
AspMyLife
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);
}
2
Daniel Howard

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

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

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

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

0
driverobject