【问题标题】:Create button during runtime in C#.net?在 C#.net 运行时创建按钮?
【发布时间】:2011-02-09 09:45:16
【问题描述】:

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

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

}

上面的代码是假代码。如何在 C#.net 中实现这一点?我想用按钮名称创建多个按钮,button1, button2, button3, button4, .... button30;

【问题讨论】:

  • 假码是什么意思?代码无法编译?
  • 我的意思是伪原型代码!

标签: c# winforms visual-studio


【解决方案1】:

您不能在 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]);
}

或者,使用List&lt;Button&gt;,如果您事先不知道需要多少按钮,这肯定会更方便。 (请参阅必填的 "arrays considered somewhat harmful" 博文。)

当然,如果您以后实际上不需要访问按钮,请不要费心将它们分配给循环外可见的任何内容:

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

您需要考虑何时需要访问哪些信息……以及如何访问这些信息。如果您在逻辑上有一个 collection 按钮,则应该使用 collection 类型变量(如列表或数组)。

坦率地说,我认为这是 VS 设计者的诅咒之一,您最终会得到诸如“groupBox1”之类的可怕名称,除了类型声明中已有的信息之外,它不携带任何信息,并鼓励开发人员通过单独考虑控件集合-命名变量。那只是我脾气暴躁:)

【讨论】:

  • 我真的需要按钮阵列吗?正如@Anuraj 回答的那样,我可以重命名按钮。
  • @HackTweaks:我不知道您是否需要按钮数组 - 我不知道您的其余代码是什么样的!您是否需要稍后访问这些按钮?
  • 我只需要访问该按钮一次。单击其他手动创建的按钮后,此按钮将被其他按钮替换。每当我单击同一个加载按钮时,都会调用这些按钮。
  • @HackTweaks:这并不完全清楚,但我假设你可以解决它。基本上,如果您不需要访问循环外的按钮,请将它们保存在一个集合中。如果您不需要访问权限,则不需要该集合。
【解决方案2】:

试试这个

for(int i = 1; i < 30; i++) {
Button button = new Button();
// Button customization here...
button.Name = "Button" + i.ToString();
groupBox1.Controls.Add(button);
}

【讨论】:

  • 如你所说,我添加了适当间距的按钮。但我真正想做的是根据 DataTable 中的行项目数创建按钮。由于空间有限,我想在按下相同的按钮/替代按钮时一次只加载 20 个按钮,剩余的 10 个按钮将被添加。我已经设置了 i
  • @HackTweaks : 我没听明白 :(
【解决方案3】:

您似乎几乎走在了正确的轨道上:

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

如果您多次尝试执行此操作,您可能必须在添加新按钮之前从控件中删除旧按钮。

【讨论】:

    【解决方案4】:
    buttons = new Button[30]; 
    for(int i = 0; i < buttons.Length; i++) {
        buttons[i] = new Button();
    
        groupBox1.Controls.Add(buttons[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]);
        }
    

    你想记住的一件事,增加你想显示它的 x 或 y 位置

    【讨论】:

      【解决方案5】:

      试试这个,我是自己学的:

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

      【讨论】:

        猜你喜欢
        • 2020-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        • 2018-05-17
        • 2011-12-08
        • 2017-03-17
        相关资源
        最近更新 更多