Forum: PC-Programmierung Variable TextBox Namen in C#.NET benutzen


von Markus S. (schmidle)


Lesenswert?

Hallo zusammen,
ich arbeite momentan mit C#.NET und komme an einer Stelle nicht richtig 
weiter.
Ich habe 128 Textfelder in einer Matrix angeordnet und möchte nun 
rausfinden in welchen von diesen Textfelder etwas drin steht und in 
welchen nicht. Die Textfelder heissen TextBox1...TextBox128.
Gibt es eine Möglichkeit alle Textfelder in einer Schleife zu 
durchlaufen und den eigentlichen Namen der TextBox mit dem 
Schleifenzähler zu kombinieren?

Ich habe hier einmal kurz versucht zu zeigen, wie ich das meine.
(Daß das so nicht geht, weiß ich schon ;-))
1
private void button7_Click_1(object sender, System.EventArgs e)
2
{
3
  string MemoryBank = "0";
4
  if("User" == comboBox7.SelectedItem.ToString() )
5
  {
6
    for (int i = 1; i < 129; i++)
7
    {
8
//                                 |
9
//                                 |
10
//                                \|/  
11
      if(this.USERDATAFORM.textBox&i.Text != "")
12
      {
13
        // Do something
14
      }
15
    }
16
    MemoryBank = "U"; 
17
  }
18
}
Vielen Dank für etwaige Antworten.

Gruß
Schmidle

von Bartli (Gast)


Lesenswert?

Verstehe ich richtig, du hast 128 Textboxen von Hand angelegt, jede ist 
in einer eigenen Instanzvariablen gespeichert und du willst nun über die 
Textboxen iterieren?

von Markus S. (schmidle)


Lesenswert?

Ja genau. Geht das?

Gruß
Schmidle

von Bartli (Gast)


Lesenswert?

Naja, wenn du wirklich ganz, ganz fest willst, kannst du dir, ähnlich 
wie in deinem Pseudocode in einer Schleife die Namen der 
Instanzvariablen als String generieren und dann z.B. mit Hilfe von 
Reflection auf die Instanzvariablen zugreifen :D

Die saubere Lösung wäre, die Textboxen nicht im Designer zu generieren 
sondern zur Laufzeit zu erzeugen und ihre Referenzen in einem Array zu 
speichern...

von Peter P. (bonsaibaum)


Lesenswert?

mach einfach
1
      foreach (TextBox box in this.Controls)
2
      {
3
        // do something with the textboxes        
4
      }

von Peter P. (bonsaibaum)


Lesenswert?

geht so leider nicht ...

Peter P. wrote:
> mach einfach
>
>
1
>       foreach (TextBox box in this.Controls)
2
>       {
3
>         // do something with the textboxes
4
>       }
5
>

sondern so:
1
      foreach (Control control in this.Controls)
2
      {
3
        if (control is TextBox)
4
          Debug.WriteLine(control.Name); // mach irgendwas damit
5
      }

von Bartli (Gast)


Lesenswert?

Naja, ist auch hässlich sich auf den im Designer vergebenen Namen zu 
verlassen, aber gehen tuts auch. Ich würd die Dinger trotzdem dynamisch 
anlegen, 128 Textboxen zu platzieren würd mich ziemlich angurken, aber 
diese Arbeit ist anscheinend ja schon gemacht :D

von Markus S. (schmidle)


Lesenswert?

Juhuu, es geht. Ich habe es so gemacht wie Peter vorgeschlagen hat. Ich 
habe leider trotz googlen die Reflection-Lösung von Bartli nicht 
verstanden. Aber ich bin sicher, daß die auch funktioniert ;-)
Vielen Dank euch beiden.

Ich bin mir schon bewußt, daß das was ich hier mache nicht sehr schön 
und wohl auch nicht nachahmenswert ist. Aber im Moment ist mir das egal, 
Hauptsache es funktioniert. Das nächste mal werde ich auf jeden Fall 
alle Felder dynamisch anlegen. Das hat definitiv ein paar unschlagbare 
Vorteile.

Nochmal vielen Dank.

Gruß
Schmidle

von Bartli (Gast)


Lesenswert?

Keine Sorge, die Lösung mit Reflection war weder wirklich ernst gemeint, 
noch ist sie empfehlenswert.

Für solche GUIs wie du anscheinend eines machst empfiehlt sich jedoch 
meistens wirklich ein kombinierter Ansatz: Grundgerüst für einen Dialog 
mit dem Designer anlegen und den Rest zur Laufzeit erledigen (z.B. 
OK/Cancel Buttons und ein leeres Panel mit dem Designer auf den Dialog 
klatschen und die Textboxen zur Laufzeit ins Panel schmeissen, dann 
kannst du auch eine Variable Anzahl von Textboxen ohne Probleme haben).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.