在C#中如何在运行时使用数组制作n * n个按钮?

时间:2019-05-03 18:05:36

标签: c#

它从用户那里获取一个数字n,并在表单上为此按钮制作n * n按钮。 运行代码时,表单上仅显示第一行,而不是所有n行。

private void button1_Click(object sender, EventArgs e)
{            
     int n = Convert.ToInt32(textBox1.Text.ToString());
     Button[,] v = new Button[n, n];
     for (int i = 0; i < n; i++)
     {
          int top = 60;
          int left = 160;
          int width = 25;
          for (int j = 0; j < n; j++)
          {
               Button c= new Button();
               c.Top =top ;
               c.Left= left;
               c.Width = width;                 
               v[i, j] = c;
               left += c.Width + 2;
           }
           top += 2;
           left = 160;
     }
     for (int i = 0; i < n; i++)
     {
          for (int j = 0; j < n; j++)
          {
               this.Controls.Add(v[i, j]);
          }
     }
}

2 个答案:

答案 0 :(得分:1)

您要在每个循环中重置top变量,所有按钮都位于相同的top位置。将top变量的初始化移到第一个循环之外

private void button1_Click(object sender, EventArgs e)
{            
    int top = 60;
    int n = Convert.ToInt32(textBox1.Text.ToString());
    Button[,] v = new Button[n, n];
    for (int i = 0; i < n; i++)
    {
        // int top = 60;
        ......

但是,您只将顶部增加2个像素。这还不足以避免用下一行覆盖一行按钮。您需要在内部循环的末尾至少增加25个像素。

        ....
        top += 25;
        left = 160;
    }

答案 1 :(得分:0)

您还可以使用for循环来设置topleft属性值(可以在for循环中定义和增加多个变量)。

对于每个row,我们将top的值增加height + padding(填充是按钮之间的间隙),对于每个col,我们将{{ 1}}由left

我们还可以在创建按钮时将其添加到控件集合中,而不是将其添加到数组中,然后在该数组上再次进行迭代,并且可以向width + padding添加一些输入验证假设为正数,如果用户输入的内容无效,则会向用户显示一个消息框。

鉴于此,我们可以将代码简化为:

textbox.Text