Как динамически добавлять кнопки в мою форму? - PullRequest
17 голосов
/ 22 декабря 2011

Я хочу создать 10 кнопок в моей форме, когда я нажимаю на кнопку1. Нет ошибки с этим кодом ниже, но он также не работает.

private void button1_Click(object sender, EventArgs e)
{
    List<Button> buttons = new List<Button>();
    for (int i = 0; i < buttons.Capacity; i++)
    {
        this.Controls.Add(buttons[i]);   
    }
}

Ответы [ 8 ]

20 голосов
/ 22 декабря 2011

Вы не создаете никаких кнопок, у вас просто пустой список.

Вы можете забыть список и просто создать кнопки в цикле.

private void button1_Click(object sender, EventArgs e) 
{     
     int top = 50;
     int left = 100;

     for (int i = 0; i < 10; i++)     
     {         
          Button button = new Button();   
          button.Left = left;
          button.Top = top;
          this.Controls.Add(button);      
          top += button.Height + 2;
     }
} 
19 голосов
/ 22 декабря 2011

Не работает, потому что список пуст.Попробуйте это:

private void button1_Click(object sender, EventArgs e)
{
    List<Button> buttons = new List<Button>();
    for (int i = 0; i < 10; i++)
    {
        Button newButton = new Button();
        buttons.Add(newButton);
        this.Controls.Add(newButton);   
    }
}
4 голосов
/ 22 декабря 2011

Вы можете сделать что-то вроде этого:

Point newLoc = new Point(5,5); // Set whatever you want for initial location
for(int i=0; i < 10; ++i)
{
    Button b = new Button();
    b.Size = new Size(10, 50);
    b.Location = newLoc;
    newLoc.Offset(0, b.Height + 5);
    Controls.Add(b);
}

Если вы хотите, чтобы они размещались любым разумным способом, лучше добавить их на одну из панелей макета (т. Е. FlowLayoutPanel ) или выровнять их самостоятельно.

1 голос
/ 03 февраля 2017

Я пришел с тем же сомнением, с текущим вкладом в вопрос, который я мог придумать:

 int altura = this.Size.Height;
            int largura = this.Size.Width;

            int alturaOffset = 10;
            int larguraOffset = 10;
            int larguraBotao = 100; //button widht
            int alturaBotao = 40;  //button height

            for (int i = 0; i < 50; ++i)
            {

                if ((larguraOffset+larguraBotao) >= largura)
                {                    
                    larguraOffset = 10;
                    alturaOffset = alturaOffset + alturaBotao;
                    var button = new Button();
                    button.Size = new Size(larguraBotao, alturaBotao);
                    button.Name = "" + i + "";
                    button.Text = "" + i + "";
                    //button.Click += button_Click;//function
                    button.Location = new Point(larguraOffset, alturaOffset);
                    Controls.Add(button);
                    larguraOffset = larguraOffset + (larguraBotao);
                }
                else
                {

                    var button = new Button();
                    button.Size = new Size(larguraBotao, alturaBotao);
                    button.Name = "" + i + "";
                    button.Text = "" + i + "";
                    //button.Click += button_Click;//function
                    button.Location = new Point(larguraOffset, alturaOffset);
                    Controls.Add(button);
                    larguraOffset = larguraOffset+(larguraBotao);

                }

            }

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

1 голос
/ 22 декабря 2011

Две проблемы - список пуст.Вам нужно сначала добавить несколько кнопок в список.Вторая проблема: Вы не можете добавить кнопки к «этому».«Это» не ссылается на то, что вы думаете, я думаю.Измените это, чтобы ссылаться на Panel, например.

//Assume you have on your .aspx page:
<asp:Panel ID="Panel_Controls" runat="server"></asp:Panel>


private void button1_Click(object sender, EventArgs e)
    {
        List<Button> buttons = new List<Button>();


        for (int i = 0; i < buttons.Capacity; i++)
        {
            Panel_Controls.Controls.Add(buttons[i]);   
        }
    }
0 голосов
/ 22 октября 2013

использовать массив кнопок следующим образом. Это создаст 3 динамические кнопки. Переменная bcoz h имеет значение 3

private void button1_Click(object sender, EventArgs e)
{
int h =3;


Button[] buttonArray = new Button[8];

for (int i = 0; i <= h-1; i++)
{
   buttonArray[i] = new Button();
   buttonArray[i].Size = new Size(20, 43);
   buttonArray[i].Name= ""+i+"";
   buttonArray[i].Click += button_Click;//function
   buttonArray[i].Location = new Point(40, 20 + (i * 20));
    panel1.Controls.Add(buttonArray[i]);

}  }
0 голосов
/ 22 декабря 2011

Во-первых, вы на самом деле не создаете 10 кнопок.Во-вторых, вам нужно установить расположение каждой кнопки, иначе они будут отображаться поверх друг друга.Это сделает трюк:

  for (int i = 0; i < 10; ++i)
  {
      var button = new Button();
      button.Location = new Point(button.Width * i + 4, 0);
      Controls.Add(button);
  }
0 голосов
/ 22 декабря 2011

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

Button newButton = new Button();  

в вашем коде плюс избавьтесь от .Capacity

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...