如何通过点击GridEl按钮获取其在Grid二维数组中的行列位置?
解决方案
要实现点击GridEl按钮时输出它在二维数组中的行列位置,你可以通过以下步骤完成:
1. 给GridEl类添加行列属性
首先,在你的GridEl类中新增专属属性,用来存储每个按钮对应的数组位置:
public class GridEl : Button { // 存储按钮所在的行号 public int Row { get; set; } // 存储按钮所在的列号 public int Column { get; set; } }
2. 创建按钮时绑定位置与点击事件
在CreateGrid方法中,每创建一个GridEl实例,就给它赋值对应的行列号,并绑定点击事件处理方法。这里我把原来的while循环换成了更直观的嵌套for循环(逻辑更清晰,也能避免边界条件出错):
void CreateGrid() { GridEl[,] Grid = new GridEl[4, 6]; // 遍历行 for (int r = 0; r < Grid.GetLength(0); r++) { // 遍历列 for (int c = 0; c < Grid.GetLength(1); c++) { Grid[r, c] = new GridEl(); // 给当前按钮绑定行列位置 Grid[r, c].Row = r; Grid[r, c].Column = c; // 按钮基础样式设置 Grid[r, c].Size = new System.Drawing.Size(64, 64); Grid[r, c].Location = new System.Drawing.Point(21 * 3 * c, 21 * 3 * r); // 绑定点击事件 Grid[r, c].Click += GridEl_Click; MainForm.Controls.Add(Grid[r, c]); } } }
3. 实现点击事件处理方法
添加一个事件处理方法,当按钮被点击时,读取它的行列属性并输出到控制台:
private void GridEl_Click(object sender, EventArgs e) { // 将触发事件的控件转换为GridEl类型 if (sender is GridEl clickedButton) { Console.WriteLine($"Row: {clickedButton.Row}; Column: {clickedButton.Column}"); } }
补充说明
- 给
GridEl添加专属行列属性的好处是,每个按钮能直接记住自己的位置,避免了闭包陷阱(如果直接在循环中捕获r/c变量,可能会因为变量引用问题输出错误的位置)。 - 如果你坚持要用原来的while循环,只需要在创建
Grid[r,c]后添加行列赋值和点击事件绑定即可,核心逻辑完全一致。
内容的提问来源于stack exchange,提问作者Nazarii
相关产品推荐
相关产品推荐

