kmetin
kmetin

Reputation: 263

How to add buttons dynamically to my form?

I want to create 10 buttons on my form when I click on button1. No error with this code below but it doesnt work either.

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

Upvotes: 21

Views: 142145

Answers (8)

Vvisions
Vvisions

Reputation: 51

I had the same doubt and came up with the following contribution:

 int height = this.Size.Height;
 int width = this.Size.Width;

 int widthOffset = 10;
 int heightOffset = 10;

 int btnWidth = 100;  // Button Widht
 int btnHeight = 40;  // Button Height

 for (int i = 0; i < 50; ++i)
 {
     if ((widthOffset + btnWidth) >= width)
     {                    
         widthOffset = 10;
         heightOffset = heightOffset + btnHeight

         var button = new Button();
         button.Size = new Size(btnWidth, btnHeight);
         button.Name = "" + i + "";
         button.Text = "" + i + "";
         //button.Click += button_Click; // Button Click Event
         button.Location = new Point(widthOffset, heightOffset);

         Controls.Add(button);

         widthOffset = widthOffset + (btnWidth);
     }

     else
     {                        
         var button = new Button();
         button.Size = new Size(btnWidth, btnHeight);
         button.Name = "" + i + "";
         button.Text = "" + i + "";
         //button.Click += button_Click; // Button Click Event
         button.Location = new Point(widthOffset, heightOffset);

         Controls.Add(button);

         widthOffset = widthOffset + (btnWidth);
      }
  }

Expected Behaviour:
This will generate the buttons dinamically and using the current window size, "break a line" when the button exceeds the right margin of your window.

Upvotes: 1

rithish
rithish

Reputation: 131

use button array like this.it will create 3 dynamic buttons bcoz h variable has value of 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]);

}  }

Upvotes: 1

Igby Largeman
Igby Largeman

Reputation: 16747

You aren't creating any buttons, you just have an empty list.

You can forget the list and just create the buttons in the loop.

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

Upvotes: 24

MethodMan
MethodMan

Reputation: 18843

You can't add a Button to an empty list without creating a new instance of that Button. You are missing the

Button newButton = new Button();  

in your code plus get rid of the .Capacity

Upvotes: 0

pstrjds
pstrjds

Reputation: 17428

You could do something like this:

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

If you want them to layout in any sort of reasonable fashion it would be better to add them to one of the layout panels (i.e. FlowLayoutPanel) or to align them yourself.

Upvotes: 5

Hairgami_Master
Hairgami_Master

Reputation: 5539

Two problems- List is empty. You need to add some buttons to the list first. Second problem: You can't add buttons to "this". "This" is not referencing what you think, I think. Change this to reference a Panel for instance.

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

Upvotes: 1

Marty
Marty

Reputation: 7522

First, you aren't actually creating 10 buttons. Second, you need to set the location of each button, or they will appear on top of each other. This will do the trick:

  for (int i = 0; i < 10; ++i)
  {
      var button = new Button();
      button.Location = new Point(button.Width * i + 4, 0);
      Controls.Add(button);
  }

Upvotes: 0

alf
alf

Reputation: 18530

It doesn't work because the list is empty. Try this:

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

Upvotes: 23

Related Questions