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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:41:37