web-dev-qa-db-fra.com

Comment ajouter des boutons dynamiquement à mon formulaire?

Je veux créer 10 boutons sur mon formulaire lorsque je clique sur le bouton 1. Aucune erreur avec ce code ci-dessous, mais cela ne fonctionne pas non plus.

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

Cela ne fonctionne pas car la liste est vide. Essaye ça:

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

Vous ne créez pas de boutons, vous avez juste une liste vide.

Vous pouvez oublier la liste et créer les boutons dans la boucle.

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;
     }
} 
20
Igby Largeman

Vous pouvez faire quelque chose comme ça:

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

Si vous souhaitez qu'ils agencent d'une manière raisonnable, il est préférable de les ajouter à l'un des panneaux d'agencement (par exemple, FlowLayoutPanel ) ou de les aligner vous-même.

4
pstrjds

Je suis venu avec le même doute, avec la contribution actuelle sur la question que je pouvais proposer:

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

                }

            }

Le comportement attendu est que, cela générera des boutons en utilisant l'état actuel de la taille de votre fenêtre. Toujours couper une ligne lorsque le bouton suivant dépasse la marge de droite de votre fenêtre.

1
Vvisions

Deux problèmes - la liste est vide. Vous devez d'abord ajouter des boutons à la liste. Deuxième problème: vous ne pouvez pas ajouter de boutons à "this". "Ceci" ne fait pas référence à ce que vous pensez, je pense. Modifiez cela pour faire référence à un panneau, par exemple.

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

utiliser un tableau de boutons comme this.it créera 3 boutons dynamiques

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
rithish

Vous ne pouvez pas ajouter un bouton à une liste vide sans créer une nouvelle instance de ce bouton. Il vous manque le 

Button newButton = new Button();  

dans votre code plus débarrassez vous du .Capacity

0
MethodMan

Premièrement, vous ne créez pas réellement 10 boutons. Deuxièmement, vous devez définir l'emplacement de chaque bouton, sinon ils apparaîtront l'un sur l'autre. Ça fera l'affaire:

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