创建和定位按钮数组

时间:2013-10-23 18:28:03

标签: c# winforms

大家好我需要帮助定位一组按钮。我想制作这个功能,所以它扫描前一个按钮的名称,然后命名下一个+ 1,之后我想把这些按钮放在上面屏幕之间有一定的空间,它们位于屏幕的中心。我已多次尝试修改我的方法,但我不知道如何使用这种方法。

这就是我的方法的样子。 更新 PS.Reference未设置为对象Q.Q

的实例
   public Button[] ButtonCreator(byte numOfBtnsNeeded,Form1 form)
   {
       Button[] mybtns = new Button[numOfBtnsNeeded];
       foreach (Button  b in mybtns)
       {
               for (int i = 0; i < mybtns.Length; i++)
               {
                   mybtns[i].Name = i.ToString();
                   mybtns[i].Parent = form;
                   mybtns[i].Height = 50;
                   mybtns[i].Width = 50;
                   for (int k = i + 1; k < mybtns.Length; k++)
                   {
                       mybtns[i].Location = new Point(190, 80);
                       mybtns[k].Location = Point.Add(new Point(mybtns[i].Location.X + 10,mybtns[i].Location.Y + 10),new Size(mybtns[i].Size.Width,mybtns[i].Size.Height));
                   }
               }
       }
       foreach (Button b in mybtns)
       {
           b.Show();
       }
       return mybtns;
   }

3 个答案:

答案 0 :(得分:1)

玩这个例子......

Button Grid

public partial class Form1 : Form
{

    private List<List<Button>> grid = new List<List<Button>>();

    public Form1()
    {
        InitializeComponent();
        byte numRows = 5;
        byte numCols = 5;
        for (byte i = 0; i < numRows; i++)
        {
            grid.Add(ButtonRowCreator(numCols, 25, (i+1) * 50));
        }
    }

    public List<Button> ButtonRowCreator(byte numOfBtnsNeeded, int x, int y)
    {
        List<Button> btns = new List<Button>();
        for (int i = 0; i < numOfBtnsNeeded; i++)
        {
            Button btn = new Button();
            btn.Size = new Size(50, 50);
            btn.Location = new Point(x + (i * btn.Width), y);
            btns.Add(btn);
            this.Controls.Add(btn);
            btn.Click += new EventHandler(btn_Click);
        }
        return btns;
    }

    void btn_Click(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        btn.Text = "X";

        int curRow = -1, curCol = -1;
        for(int i = 0; i < grid.Count; i++)
        {
            int index = grid[i].IndexOf(btn);
            if (index != -1)
            {
                curRow = i;
                curCol = index;
                Console.WriteLine("curRow = " + curRow.ToString() + ", curCol = " + curCol.ToString());
            }
        }

        // ... now you can use "curRow", "curCol" and "grid" to do something ...

        // reset all BackColors:
        foreach (List<Button> row in grid)
        {
            foreach (Button col in row)
            {
                col.BackColor = Button.DefaultBackColor;
            }
        }

        // the below should give you some examples for the 
        // syntax necessary to access buttons in the grid

        // highlight current row:
        foreach (Button col in grid[curRow])
        {
            col.BackColor = Color.Yellow;
        }

        // highlight current col:
        for (int i = 0; i < grid.Count; i++)
        {
            grid[i][curCol].BackColor = Color.Yellow;
        }
    }

}

答案 1 :(得分:0)

您无法更改foreach变量引用(即b)。如果要初始化数组,则应使用for循环:

for(int i = 0; i < numOfBtnsNeeded; i++)
{
    var button = mybtns[i] = new Button();
    //Here you can modify the reference of button.

}

此外,mybtns将充满空值,因为Buttonreference type,这意味着它的默认值为空。

答案 2 :(得分:0)

你想要的东西:

public Button[] ButtonCreator(byte numOfBtnsNeeded)
{
    Button[] mybtns = new Button[numOfBtnsNeeded];

    for (int i = 0; i < mybtns.Length; i++)
    {
        mybtns[i] = new Button();
        mybtns[i].Name = (i + 1).ToString();
    }

    return mybtns;
}

我不确定你为什么使用byte而不是int,但无论哪种方式都有效。

基本上,在创建数组时,您不是在数组中创建对象。而且你不能修改你在foreach循环中循环的东西,所以你需要一个for循环。