ボタン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]);
}
}
リストが空のため、機能しません。これを試して:
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);
}
}
ボタンを作成するのではなく、空のリストを作成するだけです。
リストを忘れて、ループ内にボタンを作成するだけです。
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;
}
}
次のようなことができます:
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 )か、自分で配置する方が良いでしょう。
私が思い付く可能性のある問題に対する現在の貢献で、私は同じ疑問を抱きました:
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);
}
}
予想される動作は、これにより、ウィンドウサイズの現在の状態を使用してボタンが生成され、次のボタンがウィンドウの右マージンを超えると常に行が切断されるということです。
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]);
}
}
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]);
} }
ボタンの新しいインスタンスを作成せずに空のリストにボタンを追加することはできません。あなたが欠けています
Button newButton = new Button();
あなたのコードに加えて.Capacity
まず、実際には10個のボタンを作成していません。次に、各ボタンの位置を設定する必要があります。そうしないと、ボタンが互いに重なり合って表示されます。これはトリックを行います:
for (int i = 0; i < 10; ++i)
{
var button = new Button();
button.Location = new Point(button.Width * i + 4, 0);
Controls.Add(button);
}