WPF中如何动态获取动态生成的编号TextBox文本内容
实现方法
你不需要通过拼接控件名动态查找控件,直接依托WPF可视化树的子元素遍历逻辑就能拿到所有动态生成的电话号码输入框,以下是适配你现有代码框架的实现:
适配你已编写的for循环框架的写法
注意不要在循环的终止判断条件里反复执行子元素查询,提前把所有符合要求的TextBox提取为列表,既可以避免遍历过程中元素变动导致的索引错误,也能提升性能。循环内直接按索引取到对应TextBox实例,读取Text属性即可,建议增加空值过滤逻辑,跳过用户没有输入内容的无效输入框:
// 用于存储所有有效录入的电话号码 List<string> collectedPhoneNumbers = new List<string>(); // 提前提取容器内所有电话号码输入框,转为列表方便按索引访问 var phoneInputBoxes = PhoneNumberStackPanel.Children .OfType<TextBox>() // 如果后续容器内会新增其他用途的TextBox,可加下面这行名称过滤,避免误取 // .Where(tb => tb.Name.StartsWith("PhoneNumberTextBox")) .ToList(); for (int i = 0; i < phoneInputBoxes.Count; i++) { TextBox currentInput = phoneInputBoxes[i]; // 去除输入内容前后的多余空格,过滤空内容 string validPhone = currentInput.Text?.Trim(); if (!string.IsNullOrEmpty(validPhone)) { collectedPhoneNumbers.Add(validPhone); } }
更简洁的遍历写法
如果你不需要使用索引,直接用foreach遍历的写法更直观,不需要额外处理索引逻辑:
List<string> collectedPhoneNumbers = new List<string>(); foreach (TextBox phoneInput in PhoneNumberStackPanel.Children.OfType<TextBox>()) { string validPhone = phoneInput.Text?.Trim(); if (!string.IsNullOrWhiteSpace(validPhone)) { collectedPhoneNumbers.Add(validPhone); } }
说明:
OfType<TextBox>()返回的元素顺序和控件被加入StackPanel.Children集合的顺序完全一致,和你给控件命名的序号是对应的,不需要额外做排序处理。
内容的提问来源于stack exchange,提问作者Kostas Soulios
相关产品推荐
相关产品推荐

