C#动态循环生成按钮后,点击特定按钮批量隐藏符合条件按钮的问题
动态按钮批量隐藏的解决方案
这里提供两种简单可行的实现方式,解决你点击按钮后批量隐藏符合坐标条件按钮的需求:
方案一:利用Tag存储按钮坐标(快速改造)
这种方式不需要额外维护全局数组,只需在生成按钮时把对应的横纵序号存入Tag属性,后续通过标签匹配找到目标按钮:
1. 改造按钮生成代码
for (int i = 0; i < poz; i++) { for (int j = 0; j < pion; j++) { Button button = new Button(); button.Size = new Size(30, 30); button.Location = new Point(30 * (i + 1), 30 * (j + 1) + 50); button.Click += button_Click; // 将当前按钮的横纵序号(i,j)存入Tag,用Tuple方便读取 button.Tag = new Tuple<int, int>(i, j); Controls.Add(button); } }
2. 重写点击事件逻辑
在点击事件中,先收集所有需要隐藏的坐标,再遍历控件找到匹配的按钮并设置隐藏:
protected void button_Click(object sender, EventArgs e) { // 收集所有需要隐藏的目标坐标 var targetCoords = new List<Tuple<int, int>>(); for (int k = 0; k < m; k++) { targetCoords.Add(new Tuple<int, int>(x[k], y[k])); } // 遍历所有按钮,匹配坐标后隐藏 foreach (Control ctrl in Controls) { if (ctrl is Button btn && btn.Tag is Tuple<int, int> btnCoord) { if (targetCoords.Contains(btnCoord)) { btn.Visible = false; } } } }
方案二:维护二维按钮数组(高效实现)
如果按钮数量较多,遍历控件的效率偏低,可以在生成按钮时直接存入二维数组,后续通过坐标直接索引:
1. 声明全局二维数组
在窗体类中添加类级别的变量:
private Button[,] buttonGrid;
2. 改造按钮生成代码
// 初始化数组,大小与按钮网格一致 buttonGrid = new Button[poz, pion]; for (int i = 0; i < poz; i++) { for (int j = 0; j < pion; j++) { Button button = new Button(); button.Size = new Size(30, 30); button.Location = new Point(30 * (i + 1), 30 * (j + 1) + 50); button.Click += button_Click; // 将按钮存入对应坐标的数组位置 buttonGrid[i, j] = button; Controls.Add(button); } }
3. 重写点击事件逻辑
直接通过数组索引找到目标按钮,无需遍历整个控件集合:
protected void button_Click(object sender, EventArgs e) { for (int k = 0; k < m; k++) { int targetI = x[k]; int targetJ = y[k]; // 先检查坐标是否在有效范围内,避免索引越界报错 if (targetI >= 0 && targetI < poz && targetJ >= 0 && targetJ < pion) { buttonGrid[targetI, targetJ].Visible = false; } } }
内容的提问来源于stack exchange,提问作者Layla98
相关产品推荐
相关产品推荐

