2017-02-02 3 views
1

Ich habe insgesamt 36 Textfelder in einem Formular mit Namen Textfelder als txtBox1, txtBox2 ..... zu txtBox36. Unter ihnen sind einige der textBox auf form_load Ereignis gefüllt.Erhalten Sie alle Textfelder eines Formulars mit ihrem Namen aufsteigend

Ich möchte alle Text boxen Namen erhalten, die in aufsteigender Reihenfolge leer sind.

, was ich habe versucht:

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

Was es gibt, ist in zufälliger Reihenfolge

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

Antwort

5

Sie können LINQ verwenden, um alle mit Namen Textfelder sortiert zu erhalten:

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

Dann können Sie Namen auf diese Weise erhalten:

var name = sortedTextBoxes[0].Name; 

Wenn Sie nur Namen als String-Array wollen:

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

und bekommen Name:

var name = sortedNames[0]; 
+0

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

+0

Benötigen Sie etwas außer 'Linq verwenden'? Ich habe es aus Interesse ausprobiert und eine Fehlermeldung erhalten, dass 'ControlCollection keine Definition für Where' enthält. – Equalsk

+0

ja es gibt Fehler, @Equalsk ich möchte nur den TextBox-Namen in aufsteigender Reihenfolge abrufen. Tut mir leid, ich bin hier noob. – Sdp

1

Hier ist eine Funktion steuert rekursiv für geting, die im Falle von Containern sehr nützlich sein kann :

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

Dann können Sie tun:

Verwandte Themen