-1

我试图动态创建一个按钮数组,但我无法弄清楚如何让函数知道实际按下了哪个按钮。我尝试过这种方式,但似乎没有成功。有任何想法吗?

    public void game_setup(int columns, int rows, int mines)
    {
        //game_destroy();

        //Set Window Size
        this.Height = 50 + Options.y_ini + rows * (Options.size + Options.space);
        this.Width = 20 + 2 * Options.x_ini + columns * (Options.size + Options.space);

        //Setup the playing field
        Button[,] field = new Button[columns,rows];

        for (int i = 0; i < columns; i++)
        {
            for (int j = 0; j < rows; j++)
            {
                field[i, j] = new Button();

                //Button Size
                field[i, j].Width  = Options.size;
                field[i, j].Height = Options.size;

                //Button Position
                int x = Options.x_ini + i * (Options.size + Options.space);
                int y = Options.y_ini + j * (Options.size + Options.space);
                field[i, j].Location = new Point(x, y);                   

                //Event Handler
                int send_i = i;
                int send_j = j;
                field[i, j].Click += (sender, args) =>
                {
                    field_Click(send_i, send_j);
                };

                //Add the Button to the GameBoard
                Controls.Add(field[i, j]);

            }
        }

        //Distribute the Mines
        //...
    }

    public void field_Click(int x, int y) 
    {
        MessageBox.Show("X:" + x + " Y:" + y);
        field[1, 2].Text = "hi";

    }
4

4 回答 4

3
 field[i, j].Tag = new Point(send_i, send_j);
 field[i, j].Click += (sender, args) => {
    Button button = sender as Button;      
    Point p = (Point) button.Tag;
    field_Click(p.X, p.Y);
 };

注意:关键是您可以通过 访问实际单击Buttonsender内容,只需将其转换为Button,您就可以通过单击来完成所有操作Button

于 2013-10-25T10:23:45.537 回答
3

更改您的事件处理程序以传递 sender 参数。这是对单击的按钮的引用。

field[i, j].Click += (sender, args) =>
{
   field_Click(sender, send_i, send_j);
};

public void field_Click(object sender, int x, int y) 
{
    Button btn = sender as Button;
    MessageBox.Show(btn.Name + "X:" + x + " Y:" + y);
    field[x, y].Text = "hi";

}
于 2013-10-25T10:24:27.280 回答
0

你想要做的只是在点击发生时有 X 和 Y 。你不需要做太多事情。首先使用一个非常标准的点击事件。

然后替换这个:

int send_i = i;
int send_j = j;
field[i, j].Click += (sender, args) =>
{
    field_Click(send_i, send_j);
};

有了这个

field[i, j].Tag = i.ToString() + "|" + j.ToString();
field[i, j].Click += new EventHandler(field_Click);

现在将事件处理程序更改为以下

private void field_Click(object sender, EventArgs e)
{
    string[] sSplitTag = ((Button)sender).Tag.ToString().Split('|');
    int i = Convert.ToInt32(sSplitTag[0]);
    int j = Convert.ToInt32(sSplitTag[1]);
}

始终尝试使用标签来了解您的控件是谁的详细信息。这就是该属性的用途...标记您的控件,以便您再次见到他时可以认出他。

于 2013-10-25T11:07:12.533 回答
0
field[i, j].Name = i +j';
field[i, j].Click += (sender, args) =>
            {
                field_Click(sender, send_i, send_j);
            };



public void field_Click(object theButton, int x, int y) 
{
    var currentButton = (Button) sender;

   if ( currentButton.Name == YOUR CODE HERE IF YOU WANT TO CHECK SOMETHING)
    {
      MessageBox.Show("X:" + x + " Y:" + y);
      field[1, 2].Text = "hi";
    }
}
于 2013-10-25T10:27:37.133 回答