0

大家好,我需要一些关于按钮阵列定位的帮助。我想做这个功能,以便它扫描上一个按钮的名称并将下一个按钮命名为 +1,然后我想将这些按钮定位在屏幕上它们之间有一定的空间,它们位于屏幕的中心。我已经尝试过很多次来修改我的方法,但我不知道如何让这个方法起作用。

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

   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;
   }
4

3 回答 3

1

玩这个例子......

按钮网格

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;
        }
    }

}
于 2013-10-23T19:56:02.920 回答
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;
}

我不确定您为什么要使用 a byteover an int,但无论哪种方式都可以。

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

于 2013-10-23T18:39:43.010 回答
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将充满空值,因为Buttonis areference type这意味着它的默认值为空值。

于 2013-10-23T18:35:48.703 回答