web-dev-qa-db-ja.com

フォームにボタンを動的に追加する方法は?

ボタン1をクリックしたときにフォームに10個のボタンを作成したい.

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

リストが空のため、機能しません。これを試して:

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

ボタンを作成するのではなく、空のリストを作成するだけです。

リストを忘れて、ループ内にボタンを作成するだけです。

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

次のようなことができます:

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 )か、自分で配置する方が良いでしょう。

4
pstrjds

私が思い付く可能性のある問題に対する現在の貢献で、私は同じ疑問を抱きました:

 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
Vvisions

2つの問題-リストが空です。最初にいくつかのボタンをリストに追加する必要があります。 2番目の問題:「this」にボタンを追加することはできません。 「これ」はあなたが思うことを指しているのではないと思います。これを変更して、たとえば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]);   
        }
    }
1
Hairgami_Master

this.itのようなボタン配列を使用すると、3つの動的ボタンが作成されます。bcozh変数の値は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
rithish

ボタンの新しいインスタンスを作成せずに空のリストにボタンを追加することはできません。あなたが欠けています

Button newButton = new Button();  

あなたのコードに加えて.Capacity

0
MethodMan

まず、実際には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
Marty Dill