C#按钮点击事件。从二维数组中提取坐标

4
我正在使用C#制作扫雷游戏,以下是我的代码部分,用于检查用户是否按下了格子上的某个按钮。然而,我相信实现这一功能的方法是将用户按下的按钮的x和y坐标拆分。
换句话说,代码中有两个二维数组。第一个数组button[10,10]包含了100个按钮。第二个数组grid[10,10]表示游戏区域,我规定-1代表地雷,1代表空格。我正在尝试提取玩家按下的按钮的x-y坐标,并用它来检查游戏区域。以下是我的代码:
然而,当我按下按钮时,在代码int x = System.Convert.ToInt32(split[0]);处出现了“System.FormatException”的错误信息。
请问我做错了什么?
void bttnOnclick(object sender, System.EventArgs e)
    {

        Button bttnClick = sender as Button;

        string[] split = bttnClick.Name.Split(new Char[] { ' ' });

        int x = System.Convert.ToInt32(split[0]);
        int y = System.Convert.ToInt32(split[1]);


        if (grid[x, y] == -1)
        {
            //Game Over!
            for (int xx = 0; xx < SizeX; xx++)
            {
                for (int yy = 0; yy < SizeY; yy++)
                {
                    if (grid[xx, yy] == -1)
                    {
                        buttons[xx, yy].Visible = false;
                    }

                }
            }
        }
    }

1
按钮的名称是什么?它是否包含由空格分隔的两个整数? - TheTerribleProgrammer
1
按钮名称的格式是什么? - Reza Aghaei
我刚刚做了这个:string s = bttnClick.Name = " "; - Jonathan
没关系,我明白你的意思了,我已经让它工作了,谢谢! - Jonathan
你改正了命名规范还是把坐标保存在标签中了? - Reza Aghaei
显示剩余2条评论
4个回答

2
错误信息是自我描述的,可能 split[0] 是一个不可转换为整数的字符串。
你可以使用以下任一选项来解决问题:
- 适当的命名约定
您可以使用适当的命名约定。
- 将坐标存储在点中并将其放入标记
您可以在将按钮添加到数组时,在按钮的标记中使用 Point 结构存储坐标,如 button.Tag = new Point(x,y);。然后,您可以使用 point p = (Point)(((Button)sender).Tag); 简单地取消装箱位置,并使用 p.Xp.y 作为数组的索引。
- 使用 TableLayoutPanel 和 GetColumn 和 GetRow 方法
您可以使用 TableLayoutPanel 并将按钮添加到面板中。然后,您可以使用 TableLayoutPanelGetColumnGetRow 方法找到每个单击按钮的坐标,如下所示: var column = tableLayoutPanel1.GetColumn((button)sender);
var row = tableLayoutPanel1.GetRow((button)sender);

1
当您动态创建按钮时,请确保设置名称属性。
Button[,] buttons = new Button[10, 10];

for (int i = 0; i < buttons.GetLength(0); i++ )
{
     for(int j = 0; j < buttons.GetLength(1); j++)
     {
          buttons[i, j] = new Button()
          {
               Name = i + " " + j
          };
     }
}

1
错误消息已经说明了所有:

'System.FormatException'

在这一行 - int x = System.Convert.ToInt32(split[0]); 你正在尝试将一个字符串转换为整数。然而,你要转换的字符串格式不正确,不能等同于一个字符串。尝试使用string splitString = System.Convert.ToInt32(split[0]);进行调试。然后查看splitString中保存的值。我猜它不是你要找的值。

0
string[] split = bttnClick.Name.Split(new Char[] { ' ' });

首先,我想说控件的名称属性有一些限制。我不明白你的代码是如何编译的。看看这个WPF Name property
你可以使用tag属性和/或使用下划线(_)代替空格。

关于你的问题: string[] split的内容与你期望的不同。用调试器查看一下它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接