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

C# 如何访问程序运行时动态生成的网格内字段控件

C#动态创建Grid内TextBlock控件查找方案

方案1:遍历父容器查找(适配你按名称查找的需求)

通过递归遍历Grid的所有子元素,匹配控件名称即可定位目标控件,适合少量控件的场景:

// 查找指定父容器下名称匹配的TextBlock(WPF版)
public TextBlock FindTextBlockByName(Panel parentContainer, string targetControlName)
{
    foreach (var child in parentContainer.Children)
    {
        // 匹配到直接返回
        if (child is TextBlock textBlock && textBlock.Name == targetControlName)
        {
            return textBlock;
        }
        // 子元素是容器则递归查找
        if (child is Panel childPanel)
        {
            var result = FindTextBlockByName(childPanel, targetControlName);
            if (result != null) return result;
        }
    }
    return null;
}

调用示例:

// 假设你的Grid控件名为DynamicGrid,要找的控件名称为Tb_Row2_UserAge
var targetTb = FindTextBlockByName(DynamicGrid, "Tb_Row2_UserAge");
if (targetTb != null)
{
    targetTb.Text = "18";
}

方案2:提前存储映射字典(更高性能的推荐方案)

动态创建控件时直接将名称和控件实例存入字典,后续无需遍历直接取值,适合大量动态控件的场景:

// 窗口类中定义全局字典存储映射关系
private Dictionary<string, TextBlock> _dynamicTextBlockMap = new Dictionary<string, TextBlock>();

// 动态创建TextBlock时存入字典
for (int row = 0; row < 动态行数; row++)
{
    // 你的其他创建行逻辑...
    TextBlock newTb = new TextBlock();
    string uniqueName = $"Tb_Row{row}_{字段标识}";
    newTb.Name = uniqueName;
    // 其他属性赋值、添加到Grid的逻辑...
    _dynamicTextBlockMap.Add(uniqueName, newTb);
}

后续调用示例:

if (_dynamicTextBlockMap.TryGetValue("Tb_Row2_UserAge", out TextBlock targetTb))
{
    targetTb.Text = "18";
}

注意事项

  • 动态生成的控件不会在XAML后台类自动生成声明字段,无法直接通过this.控件名的方式访问,必须通过上述两种方式获取实例
  • 如果你用的是WinForms项目,逻辑基本一致,只需将遍历对象换成父容器的Controls集合,控件类型替换为对应类型即可
  • 需确保你设置的唯一名称无重复,否则字典插入会报错,遍历查找也只能返回第一个匹配的控件

内容的提问来源于stack exchange,提问作者Kyler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 05:06:03