2017-02-02 5 views
1

У меня есть всего 36 текстовых полей в форме с именем текстовых полей как txtBox1, txtBox2 ..... to txtBox36. Среди них некоторые текстовые поля заполняются событием 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 

ответ

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]; 
+0

&& String.IsNullOrEmpty ((TextBox) i.Text) – Esko

+0

Вам нужно что-нибудь помимо 'using Linq; 'для этого? Я попробовал это из интереса и получил сообщение об ошибке: 'ControlCollection не содержит определения для Where'. – Equalsk

+0

да, это дает ошибку, @Equalsk я просто хочу, чтобы получить имя текстового поля в порядке возрастания. Извините, что я здесь. – Sdp

1

Вот функция для адресности управления recursivly, которые могут быть полезны в случае контейнеров :

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