按钮阵列-按下哪个按钮?c#

按钮阵列-按下哪个按钮?c#,c#,winforms,button,C#,Winforms,Button,我试图动态创建一个按钮数组,但我不太明白如何让函数知道实际按下了哪个按钮。。我试过这样做,但似乎没有成功。有什么想法吗 public void game_setup(int columns, int rows, int mines) { //game_destroy(); //Set Window Size this.Height = 50 + Options.y_ini + rows * (Options.size + Opti

我试图动态创建一个按钮数组,但我不太明白如何让函数知道实际按下了哪个按钮。。我试过这样做,但似乎没有成功。有什么想法吗

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

    }
publicvoid游戏设置(int列、int行、int矿)
{
//游戏_销毁();
//设置窗口大小
this.Height=50+Options.y_ini+rows*(Options.size+Options.space);
this.Width=20+2*Options.x_ini+columns*(Options.size+Options.space);
//建立竞争环境
按钮[,]字段=新按钮[列,行];
对于(int i=0;i
{
字段单击(发送i、发送j);
};
//将按钮添加到游戏板
添加(字段[i,j]);
}
}
//分配地雷
//...
}
公共无效字段\单击(整数x,整数y)
{
MessageBox.Show(“X:+X+”Y:+Y);
字段[1,2]。Text=“hi”;
}

注意:关键是您可以通过
发送方
访问实际单击的
按钮
,只需将其转换为
按钮
,您可以使用单击的
按钮

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

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

}

你要做的就是当点击发生时有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]);
}

始终尝试使用标记来了解控件的详细信息。这就是这房子的用途。。。标记你的控制按钮,以便再次见到他时能认出他。

这听起来像是我问题的解决方案,是的。但是恐怕我没有把这个问题说清楚。。我需要能够访问此方法中的所有字段[x,y]。有什么方法可以做到这一点吗?例如,我想知道我按下了什么按钮(例如字段[1,2]),然后做一些事情将其与其他字段[]s进行比较。@Timme您需要将
字段
变量设置为类变量。这样,类中的所有方法都可以访问它。
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]);
}