是否有可能改变在WinForms中循环的控件的顺序

时间:2018-04-11 08:21:39

标签: c# winforms

以下代码循环遍历当前表单中的所有控件,并完美地处理空值。我对它的抱怨是,它似乎遵循控件的Tab键顺序的保留,即它从最后一个控件开始,然后回到第一个控件。

foreach (Control C in this.Controls)
{
    if (C.GetType() == typeof(System.Windows.Forms.TextBox))
    {
        if (C.Text == null || C.Text == string.Empty || C.Text == "")
        {
            setControlErrors(C, "This field cannot be empty, you must enter a value");
            return false;
        }
        else
        {
            errorProvider1.SetError(C, "");
        }
    }
    if (C.GetType() == typeof(System.Windows.Forms.ComboBox))
    {
        if(C.Text == null || C.Text == string.Empty || C.Text == "")
        {
            setControlErrors(C, "This field cannot be empty, you must select a value");
            return false;
        }
        else
        {
            errorProvider1.SetError(C, "");
        }
    }
}

如何轻松扭转此订单?看到表单布局的相反顺序的验证错误似乎很奇怪。更改tab-index似乎比这更糟糕。

有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

您可以按标签索引对控件进行排序,如此

foreach (Control control in this.Controls.Cast<Control>()
                                         .OrderBy(c => c.TabIndex))
{
    //..
}

答案 1 :(得分:1)

您可以使用以下代码

        var controls = this.Controls.Cast<Control>()
                           .OrderByDescending(x => x.TabIndex);

        foreach (var control in controls)
        {
        }

答案 2 :(得分:0)

这个解决方案怎么样?

foreach (Control C in this.Controls.Cast<Control>().OrderBy(ctr => ctr.TabIndex))