获取表单的所有文本框,其名称按升序排列

Get all textboxes of an form with their name in ascending order

我在表单中总共有 36 个文本框,文本框的名称为 txtBox1、txtBox2..... 到 txtBox36。其中一些textBox是在form_load事件中填充的。

我想按升序获取所有为空的文本框名称。

我尝试过的:

foreach (Control control in this.Controls)
{
    if (control is TextBox)
    {
        if (String.IsNullOrEmpty(control.Text))
        {
            for (int j = 1; j <= 36; j++)
            {
                MessageBox.Show(control.Name.ToString());
            }
        }
    }
}

它给出的是随机顺序

txtBox26
txtBox28
txtBox31
txtBox34
txtBox33
txtBox30
txtBox27
txtBox29
txtBox25
txtBox14
txtBox16
txtBox19
txtBox21
txtBox18
txtBox17
txtBox23
txtBox24
txtBox13
txtBox7
txtBox10
txtBox6
txtBox3
txtBox11
txtBox12

您可以使用 LINQ 使所有文本框按名称排序:

var allTexboxes = this.Controls.OfType<TextBox>();
var sortedTextBoxes = allTexboxes
                     .Where(i => String.IsNullOrEmpty(i.Text))
                     .OrderBy(i => i.Name)
                     .ToArray();

那么你可以通过这种方式获取名字:

var name = sortedTextBoxes[0].Name;

如果您只想将名称作为字符串数组:

var allTexboxes = this.Controls.OfType<TextBox>();
var sortedNames = allTexboxes
                 .Where(i => String.IsNullOrEmpty(i.Text))
                 .OrderBy(i => i.Name)
                 .Select(i => i.Name)
                 .ToArray();

并获取名称:

var name = sortedNames[0];

这是一个递归获取控件的函数,它在容器的情况下很有用:

public static List<T> GetControls<T>(this Control _mainControl, int _maxDepth = 10) where T : Control
    {
        if (_maxDepth < 0)
            return new List<T>();

        List<T> ObjectList = new List<T>();

        foreach (Control CurrentControl in _mainControl.Controls)
        {
            if (CurrentControl is T)
            {
                ObjectList.Add(CurrentControl as T);
            }
            else
            {
                ObjectList.AddRange(CurrentControl.GetControls<T>((_maxDepth - 1)));
            }
        }
        return ObjectList;
    }

然后你可以这样做:

var OrderedTextboxes = this.GetControls<TextBox>().OrderBy(x => x.Name);