在网上查到一种方法:
 
public void creatbtn(int number)
        {            Button[] name = new Button[number];              //控件可以随意设置,比如:CheckBox,TextBox等   
            for (int i = 0; i < number; i++)
            {
                name[i] = new Button();
                name[i].Location = new Point(20, 100 + i * 30);    //位置自己调整   
                name[i].Size = new Size(200, 30);                  //大小同样   
                this.Controls.Add(name[i]);                        //窗体上有一个panel1   
                string btnname=name[i].ToString();
                name[i].Text = btnname;                            //这句我自己加的,为了看看name[i]写的什么
            }
        }最后生成的button,其text都是:"Systerm.Windows.Forms.Button,"(注意尾部逗号也在文本中)
但是这样生成的button,如何定义其click事件?如果要更改其name属性怎么改?注意是批量的,也就是说事先并不知道number的值。

解决方案 »

  1.   

    正常应该是 "System.Windows.Forms.Button, Text: " 你那个按钮太窄文字没有显示完整吧...加点击事件
            name[i].Click += new System.EventHandler(this.button1_Click);        private void button1_Click(object sender, EventArgs e)
            {        }
      

  2.   

     name[i].Click += (object sender, EventArgs e)=>{//你的函数方法};
      

  3.   

    此方法可行,但使用后出现新问题:
            public void creatbtn(int number)
            {
                string[] tmpnum = new string[number];//声明string类的对象矩阵
                Button[] name = new Button[number];//声明button类的对象矩阵
                  Form3[] fo = new Form3[number];//声明form类的对象矩阵
                try
                {
                    for (int i = 0; i < number; i++)//批量声明和定义
                    {                    tmpnum[i] = "button" + i.ToString();
                        name[i] = new Button();
                        name[i].Location = new Point(20, 100 + i * 30);//位置自己调整   
                           name[i].Size = new Size(300, 30);//大小同样                          this.Controls.Add(name[i]);//窗体上有一个panel1   
                        name[i].Name = tmpnum[i];//给按钮重命名                    fo[i] = new Form3();                    name[i].Click += (object sender, EventArgs e) =>
                            {
                                fo[i].Show();
                            };
                    }
                }
                catch (Exception e1)
                {
                    System.Windows.Forms.MessageBox.Show("The process failed: {0}", e1.ToString());
                }
        
            }结果说:“索引超出了数组界限。”百思不解,如何是好?
      

  4.   

    自己顶一下。帮助里有这么一句:确保数据列名称正确。
    如果提供给 DataView..::.Sort 属性的数据列名称无效,则可能引发此异常。有关更多信息,请参见 DataView 属性。是不是跟这个数据列名有关系?
      

  5.   


    不是扫雷,是一个篮球赛技术统计的小软件,需要根据球员数量批量声明button和定义click事件,但是每个button对应的click事件是显示不同的Form2的实例。结果说:“索引超出了数组界限。”如何改呢?
      

  6.   

    另一种思路:能否用buttonArray来实现?大家不吝赐教啊
      

  7.   

    应该用这个说法,而且可以根据sender来判断是哪个按钮
      

  8.   

    多个button做成同一事件,遍历
      

  9.   

    如果是在一个窗体生成多个button的话,用不着数组的。直接一个for循环就够了。添加事件就更简单了。
      

  10.   

    name[i].Click += (object sender, EventArgs e) =>
      {
      fo[i].Show();
      };
    这样写感觉有问题
      

  11.   


    就是这一句报错:
     fo[i].Show();说是“索引超出了数组界限。”怎么回事呢?
      

  12.   

    如何实现根据sender来判断点击了哪个按钮呢?
      

  13.   

    “C#中如何批量声明button并定义其click事件”,不知道为什么会有批量按钮出现?
    是什么样的需求?能否在用其他简洁的方式替代?
      

  14.   

    如果你确实想这样做,那我建议建一个公共的Click处理函数:
    public void creatbtn(int number)
    {  Button[] name = new Button[number]; //控件可以随意设置,比如:CheckBox,TextBox等  
      for (int i = 0; i < number; i++)
      {
         name[i] = new Button();
         name[i].Location = new Point(20, 100 + i * 30); //位置自己调整  
         name[i].Size = new Size(200, 30); //大小同样  
         this.Controls.Add(name[i]); //窗体上有一个panel1  
         string btnname=name[i].ToString();
         name[i].Text = btnname; //这句我自己加的,为了看看name[i]写的什么      name[i].Tag=btnname;  //这里做上标记,为事件处理时所用
         name[i].Click += new System.EventHandler(CommonButton_Click);
      }
    }private void CommonButton_Click(object sender, EventArgs e)
    {
        string btn=sender.Tag.ToString();  //这里取出创建时做的标记,对下面可以做不同处理
        。。
    }
      

  15.   

    private void Form1_Load(object sender, EventArgs e)
            {
                for (int i = 0; i < 7; i++)
                {
                    for (int j = 0; j < 7; j++)
                    {
                        Button btn = new Button();
                        btn.Location = new System.Drawing.Point(20+(i*40), 20+(j*40));
                        btn.Size = new System.Drawing.Size(40, 40);
                        btn.Text = (j+1)+"-"+(i+1);
                        btn.Click += new System.EventHandler(this.btn_Click);
                        this.Controls.Add(btn);
                    }
                }
            }        private void btn_Click(object sender, EventArgs e)
            {
                Button btn=(Button)sender;
                //往下就可以调用了
            }
    简单写了一下,有什么不懂的可以继续说。
      

  16.   

    name[i].ToString()永远都是Systerm.Windows.Forms.Button,因为name[i] is Button
    如果那个“索引超出了数组界限”是在你单击按钮的时候出现的话,你可以断点看看是不是i的问题