C#中Foreach读取TextBox顺序异常问题求助
解决TextBox按TabIndex顺序读取坐标到List的问题
你遇到的读取顺序异常,核心原因是默认遍历控件的顺序是控件添加到容器的顺序,不是你设置的TabIndex顺序。要按TabIndex读取,得先把目标TextBox按TabIndex升序排序,再依次读取值。
步骤1:筛选并排序目标TextBox
首先要把需要读取的TextBox(比如所有存x/y坐标的)筛选出来,再按TabIndex从小到大排序。如果你的TextBox有统一命名规则(比如txtSurX_1、txtSurY_1这类),可以用名字筛选;如果没有,也可以通过Tag或者其他标记区分。
示例代码:
// 获取当前窗体中所有TextBox,按TabIndex升序排序 var sortedTextBoxes = this.Controls.OfType<TextBox>() .OrderBy(txt => txt.TabIndex) .ToList(); // 如果是分x/y组的,比如x坐标的TextBox名字都带"SurX",y的带"SurY" var xTextBoxes = this.Controls.OfType<TextBox>() .Where(txt => txt.Name.Contains("SurX")) .OrderBy(txt => txt.TabIndex) .ToList(); var yTextBoxes = this.Controls.OfType<TextBox>() .Where(txt => txt.Name.Contains("SurY")) .OrderBy(txt => txt.TabIndex) .ToList();
如果你的TextBox嵌套在Panel、GroupBox这类子容器里,需要递归遍历所有子控件,写个辅助方法就行:
// 递归获取所有子控件中的TextBox private IEnumerable<TextBox> GetAllTextBoxes(Control parent) { foreach (Control ctrl in parent.Controls) { if (ctrl is TextBox txt) yield return txt; // 递归遍历子容器 foreach (var childTxt in GetAllTextBoxes(ctrl)) yield return childTxt; } }
调用时用GetAllTextBoxes(this)就能拿到所有TextBox了。
步骤2:按排序后的顺序读取值到列表
接下来替换你原来的读取逻辑,用排序后的控件集合来读取,同时建议用double.TryParse替代double.Parse——这样能处理用户输入非数值的情况,避免程序崩溃。
修改后的完整方法示例:
public Boolean Nacitanie_hodnot() { // 清空列表并添加初始值 sur_x.Clear(); sur_y.Clear(); sur_x.Add(0); sur_y.Add(0); // 获取并排序x、y坐标的TextBox var xTextBoxes = GetAllTextBoxes(this) .Where(txt => txt.Name.Contains("SurX")) .OrderBy(txt => txt.TabIndex) .ToList(); var yTextBoxes = GetAllTextBoxes(this) .Where(txt => txt.Name.Contains("SurY")) .OrderBy(txt => txt.TabIndex) .ToList(); // 读取x坐标 foreach (var txt in xTextBoxes) { if (double.TryParse(txt.Text.Trim(), out double xValue)) { sur_x.Add(xValue); } else { MessageBox.Show($"控件{txt.Name}的输入不是有效的数值,请检查!"); return false; } } // 读取y坐标 foreach (var txt in yTextBoxes) { if (double.TryParse(txt.Text.Trim(), out double yValue)) { sur_y.Add(yValue); } else { MessageBox.Show($"控件{txt.Name}的输入不是有效的数值,请检查!"); return false; } } return true; }
额外注意事项
- 确保所有目标TextBox的TabIndex是唯一且按你需要的顺序设置的,重复的TabIndex会导致排序混乱。
- 如果你的x和y坐标是一一对应的(比如TabIndex1对应x1,TabIndex2对应y1),也可以按成对的方式读取,比如遍历排序后的所有TextBox,每两个一组分别加入sur_x和sur_y。
内容的提问来源于stack exchange,提问作者Matej
相关产品推荐
相关产品推荐

