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
相关产品推荐
相关产品推荐

