在C#.net运行时创建按钮?

在C#.net运行时创建按钮?,c#,winforms,visual-studio,C#,Winforms,Visual Studio,我知道如何在运行时创建按钮 Button button1 = new Button(); button1.Location = new Point(20,10); button1.Text = "Click Me"; // adding to groupBox1 groupBox1.Controls.Add(button1); 但问题是我想添加多个这样的按钮 for(int i = 1; i < 30; i++) { Button button[i] = new Button(); /

我知道如何在运行时创建按钮

Button button1 = new Button();

button1.Location = new Point(20,10);
button1.Text = "Click Me";
// adding to groupBox1
groupBox1.Controls.Add(button1);
但问题是我想添加多个这样的按钮

for(int i = 1; i < 30; i++) {
Button button[i] = new Button();
// Button customization here...
...
groupBox1.Controls.Add(button[i]);

}
for(int i=1;i<30;i++){
按钮按钮[i]=新按钮();
//按钮自定义在这里。。。
...
groupBox1.Controls.Add(按钮[i]);
}

上面的代码是假代码。如何在C#net中实现这一点?我想用按钮名、按钮1、按钮2、按钮3、按钮4等创建多个按钮。。。。按钮30

在C#中,您不能在执行时声明额外的变量,但无论如何,您都不想声明,因为之后您将无法动态访问它们。只需创建一个数组:

// buttons would be declared as Button[] as a member variable
buttons = new Button[30]; 
for(int i = 0; i < buttons.Length; i++) {
    buttons[i] = new Button();
    // Button customization here...
    ...
    groupBox1.Controls.Add(buttons[i]);
}
//按钮将被声明为Button[]作为成员变量
按钮=新按钮[30];
对于(int i=0;i
或者,使用
列表
,如果您事先不知道需要多少个按钮,这肯定会更方便。(参见必读的博客文章。)

当然,如果您以后实际上不需要使用按钮,请不要麻烦将它们指定给循环外部可见的任何对象:

for(int i = 0; i < 30; i++) {
    Button button = new Button();
    // Button customization here...
    ...
    groupBox1.Controls.Add(button);
}
for(int i=0;i<30;i++){
按钮按钮=新按钮();
//按钮自定义在这里。。。
...
groupBox1.Controls.Add(按钮);
}
您需要考虑在以下情况下需要访问哪些信息。。。以及您希望如何访问它。如果逻辑上有一个按钮集合,则应使用集合类型变量(如列表或数组)

坦白地说,我认为这是VS设计者的诅咒之一,你最终得到了可怕的名字,比如“groupBox1”,它没有超出类型声明中已有的信息,并鼓励开发人员考虑通过单独命名的变量来收集控件。这就是我脾气暴躁的原因:)

试试这个

for(int i = 1; i < 30; i++) {
Button button = new Button();
// Button customization here...
button.Name = "Button" + i.ToString();
groupBox1.Controls.Add(button);
}
for(int i=1;i<30;i++){
按钮按钮=新按钮();
//按钮自定义在这里。。。
button.Name=“button”+i.ToString();
groupBox1.Controls.Add(按钮);
}

你看起来几乎走上了正确的轨道:

// in form class
Button[] m_newButtons = new Button[30];

// in your trigger function
for(int i = 0; i < 30; ++i)
{
    m_newButtons[i] = new Button();
    // ...
    groupBox1.Controls.Add(m_newButtons[i]);
}
//在表单类中
按钮[]m_newButtons=新按钮[30];
//在你的触发函数中
对于(int i=0;i<30;++i)
{
m_newButtons[i]=新按钮();
// ...
groupBox1.Controls.Add(m_newButtons[i]);
}
如果您多次尝试这样做,您可能必须在添加新按钮之前从控件中删除旧按钮。

buttons=new Button[30];
buttons = new Button[30]; 
for(int i = 0; i < buttons.Length; i++) {
    buttons[i] = new Button();

    groupBox1.Controls.Add(buttons[i]);
}
对于(int i=0;i
此代码将工作,但按钮将被添加一个比另一个,所以设置位置也

buttons = new Button[30]; 
    for(int i = 0; i < buttons.Length; i++) 
    {
        buttons[i] = new Button();
        Point p=new Point(xvalue,yvalue);
       buttons[i].Location = p;       
        groupBox1.Controls.Add(buttons[i]);
    }
按钮=新按钮[30];
对于(int i=0;i

您需要记住的一件事是,增加要显示它的x或y位置

试试这个,我自己刚刚学会了:

public partial class Form1 : Form
{
 Button[] btn = new Button[12];// <--------<<<Button Array

 public Form1()
 {
  InitializeComponent();
 }   

 private void Form1_Load (object sender, EventArgs e)
 {    
    for (int i = 0; i < 12; i++)
    { 
     btn[i] = new Button ( ); 
     this.flowLayoutPanel1.Controls.Add(btn[i]);
    }
 }
 // double click on the flow layoutPannel initiates this code
 private void flowLayoutPanel1_Paint(object sender, PaintEventArgs e)
 {

 }

}
公共部分类表单1:表单
{

按钮[]btn=新按钮[12];//你说的假代码是什么意思?无法编译的代码?我指的是伪原型代码!我真的需要按钮数组吗?正如@Anuraj所回答的,我可以重命名按钮。@HackTweaks:我不知道你是否需要按钮数组-我不知道你其余的代码是什么样子!你以后需要访问按钮吗?我只需要访问一次按钮。单击其他手动创建的按钮时,此按钮将被其他按钮替换。每当我单击同一加载按钮时,这些按钮将被调用。@HackTweaks:这还不完全清楚,但我假设您可以对其进行排序。基本上,如果您不需要访问循环外的按钮,将它们保留在集合中。如果不需要访问,则不需要集合。正如您所说,我添加了具有适当间距的按钮。但我实际上想做的是根据数据表中的行项目数创建按钮。由于空间有限,我只想在按同一按钮时一次加载20个按钮/备用按钮剩余的10个按钮将被添加。我已设置i@HackTweaks:我没听懂你的话:(