我在一个表格中共有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
答案 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);