C# WinForm中如何通过控件名称遍历访问网格布局TextBox控件
WinForm填字游戏动态遍历单元格校验答案实现方案
核心思路
不需要手动写25个控件的冗余判断逻辑,因为所有文本框控件遵循统一的txtCell+行索引+列索引命名规则,完全可以通过字符串拼接控件名动态匹配对应控件,有两种成熟实现方案可以选。
方案1:校验时动态按名称查找控件
不需要提前存储控件引用,适合校验触发频率低的场景(比如点击提交按钮才校验),直接用WinForm自带的Controls.Find方法按拼接好的控件名搜索即可,支持递归搜索嵌套在Panel、GroupBox等容器里的控件。
示例代码:
// 提前定义好的正确答案二维数组,长度为5*5 private string[,] ans = new string[5,5] { // 替换成实际的正确答案即可 {"a","b","c","d","e"}, {"f","g","h","i","j"}, {"k","l","m","n","o"}, {"p","q","r","s","t"}, {"u","v","w","x","y"} }; private void btnSubmit_Click(object sender, EventArgs e) { bool isAllPass = true; for (int row = 0; row < 5; row++) { for (int col = 0; col < 5; col++) { // 按命名规则拼接目标控件名 string controlName = $"txtCell{row}{col}"; // 递归查找控件,第二个参数true表示搜索所有子容器 TextBox currentCell = this.Controls.Find(controlName, true).FirstOrDefault() as TextBox; if (currentCell == null) continue; // 控件不存在时跳过,可按需加调试报错逻辑 string userInput = currentCell.Text.Trim(); // 比对答案,不需要忽略大小写就删掉StringComparison.OrdinalIgnoreCase参数 if (!userInput.Equals(ans[row, col], StringComparison.OrdinalIgnoreCase)) { isAllPass = false; currentCell.BackColor = Color.MistyRose; // 错误格标红提示 } else { currentCell.BackColor = SystemColors.Window; // 正确格恢复默认背景 } } } if (isAllPass) { MessageBox.Show("答案全部正确!"); } }
方案2:初始化时预存控件到二维数组(推荐)
如果需要频繁触发校验(比如输入实时校验、多次提交),可以在窗体加载阶段就把所有文本框按行列索引存到二维数组里,后续校验直接访问数组元素即可,和你预期的双层循环写法完全一致,性能更高。
实现步骤:
- 首先在窗体类中定义全局的文本框二维数组:
// 全局存储单元格文本框引用 private TextBox[,] txtCell = new TextBox[5, 5]; private string[,] ans = new string[5,5]; // 存储正确答案的数组
- 在窗体的Load事件中完成数组初始化:
private void CrosswordForm_Load(object sender, EventArgs e) { for (int row = 0; row < 5; row++) { for (int col = 0; col < 5; col++) { string controlName = $"txtCell{row}{col}"; txtCell[row, col] = this.Controls.Find(controlName, true).FirstOrDefault() as TextBox; } } // 这里同时初始化ans数组的正确答案内容即可 }
- 后续校验逻辑可以直接按索引访问控件,和你写的伪代码逻辑完全匹配:
private void CheckAnswer() { bool isAllPass = true; for(int row = 0; row < 5; row++) { for(int col = 0; col < 5; col++){ string userInput = txtCell[row, col].Text.Trim(); if(userInput.Equals(ans[row, col], StringComparison.OrdinalIgnoreCase)) { txtCell[row, col].BackColor = SystemColors.Window; } else { isAllPass = false; txtCell[row, col].BackColor = Color.MistyRose; } } } if (isAllPass) { MessageBox.Show("恭喜通关!"); } }
注意事项
- 如果你习惯用交错数组的
[i][m]索引写法,只需要把二维数组定义改成TextBox[][]的交错数组格式初始化即可,逻辑完全一致。 - 比对答案时加
Trim()是为了忽略用户误输入的前后空格,可根据业务需求调整。 Controls.Find方法的递归搜索参数一定要传true,否则如果文本框放在布局容器里会找不到对应控件。
内容的提问来源于stack exchange,提问作者Chevalier
相关产品推荐
相关产品推荐

