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

时间:2017-02-02 15:01:43

标签: c# sorting visual-studio-2013

我在一个表格中共有36个文本框,文本框名称为txtBox1,txtBox2 ..... to 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

2 个答案:

答案 0 :(得分:5)

您可以使用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];

答案 1 :(得分:1)

这是一个递归定位控件的函数,在容器的情况下可能很有用:

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);