2016-11-23 3 views
2

Ich suchte nach etwas in Bezug auf diese, konnte aber nichts finden.Looping Variablen mit Index C#

Gibt es eine Möglichkeit, einen Index zu verwenden, der an eine Variable angehängt wird?

Was ich habe, so weit ist:

string tagName1 = tagNameBoxAMT1.Text; 
string tagName2 = tagNameBoxAMT2.Text; 
string tagName3 = tagNameBoxAMT3.Text; 
string tagName4 = tagNameBoxAMT4.Text; 
string tagName5 = tagNameBoxAMT5.Text; 
string tagName6 = tagNameBoxAMT6.Text; 

und was würde Ich mag haben ist:

for(int i = 0; i < 6; i++) 
{ 
    string tagNamei = tagNameBoxAMTi.Text; 
} 

ist das möglich?

+0

Sie sollten die Variablen zu einer Liste (Array, Liste, Set) hinzufügen und dann auf jede Position der Liste innerhalb Ihrer 'Schleife' zugreifen. – Tom

Antwort

3

verwalten eine Liste solcher Kontrollen:

var tagNames = new List<YourControl>() { 
    tagNameBoxAMT1, tagNameBoxAMT2, tagNameBoxAMT3, tagNameBoxAMT4, tagNameBoxAMT5, tagNameBoxAMT6 
}; 

und dann können Sie es in geeigneter Weise verwenden:

for(int i = 0; i < 6; i++) 
{ 
    string tagNamei = tagNames[i].Text; 
} 

Wenn tagNameBoxAMT1 und andere Felder/Eigenschaften, Sie könnte Verwendung Reflexion zu tun Es wird automatisch aber nicht empfohlen.

Wenn Sie mit Reflection Ansatz gehen möchte, ist hier der Beispielcode:

class SomeWindow 
{ 
    private SomeControl tagNameBoxAMT1; 
    private SomeControl tagNameBoxAMT2; 
    private SomeControl tagNameBoxAMT3; 

    public SomeWindow() 
    { 
     tagNameBoxAMT1 = new SomeControl() { Text = "Text1" }; 
     tagNameBoxAMT2 = new SomeControl() { Text = "Text2" }; 
     tagNameBoxAMT3 = new SomeControl() { Text = "Text3" }; 
    } 

    public void GiveMeWithReflection() 
    { 
     var thisType = typeof(SomeWindow); 
     var controlType = typeof(SomeControl); 

     var textProperty = controlType.GetProperty("Text"); 

     var props = thisType.GetFields(System.Reflection.BindingFlags.Instance | 
             System.Reflection.BindingFlags.NonPublic) 
          .Where(fi => fi.Name.StartsWith("tagNameBoxAMT")); 
     foreach (var prop in props) 
     { 
      var control = prop.GetValue(this); 
      var tagName = textProperty.GetValue(control); 
     } 
    } 
} 
+0

'tagNamei' müsste auch ein Element eines Arrays sein ... – ChrisF

+0

Perfekt, danke. Dachte, es gäbe einen anderen Weg wie CodeDom oder ähnliches. Das ist definitiv gut genug. – NM24

+0

@ NateM24 Ich habe gerade mit dem möglichen Reflection-Ansatz aktualisiert. –

0

Stellen Sie sicher, das ist die TextBoxes zu tun direkt auf dem Formular sein, nicht in einem Container :)

private void button1_Click(object sender, EventArgs e) { 

string[] array = this.Controls.OfType <TextBox>().Select(r => r.Text).ToArray(); 

for (int i = 0; i < 6; i++) { 
    Console.WriteLine(array[i]); //This is used to dispaly array values 
} 

} 

Sie dies auch versuchen können, eine einfache foreach Schleife wie verwenden:

List<string> list = new List<string>(); 
    foreach (Control c in this.Controls) 
     { 
      if (c is TextBox) 
      list.Add((c as TextBox).Text); 

     }