You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:初始化时预存控件到二维数组(推荐)

如果需要频繁触发校验(比如输入实时校验、多次提交),可以在窗体加载阶段就把所有文本框按行列索引存到二维数组里,后续校验直接访问数组元素即可,和你预期的双层循环写法完全一致,性能更高。
实现步骤:

  1. 首先在窗体类中定义全局的文本框二维数组:
// 全局存储单元格文本框引用
private TextBox[,] txtCell = new TextBox[5, 5];
private string[,] ans = new string[5,5]; // 存储正确答案的数组
  1. 在窗体的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数组的正确答案内容即可
}
  1. 后续校验逻辑可以直接按索引访问控件,和你写的伪代码逻辑完全匹配:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:03:29