Entwickler-Ecke

WinForms - Alle Textboxen in Anwendung auslesen und...


SubZero - Fr 15.03.13 11:17
Titel: Alle Textboxen in Anwendung auslesen und...
Hallo Leute,

ich hoffe ihr könnt mir helfen.
Ich bin relativen unwissend und neuling wenn es um Programmieren geht.

Ich will in meiner Anwendung aus allen Textboxen den beinhalteten Text auswerten und danach die Schriftfarbe darin ändern.

sozusagen....

#Alle Textboxen auswerten
# wenn "false" drin steht
#--> schriftfarbe rot
# wenn "true" drin steht
#--> schriftfarbe grün
# ansonsten
#-->schriftfarbe schwarze

Danke schonmal =)


Th69 - Fr 15.03.13 12:10

Hallo SubZero :welcome:

die Gegenfrage ist, wie hast du die TextBoxen auf der Form platziert und benannt (über den Designer oder vom Programmcode her und in einer Liste gehalten)?

Sofern alle TextBoxen direkt auf der Form platziert sind (und nicht in weiteren Controls, z.B. Panels):
unter http://www.entwickler-ecke.de/viewtopic.php?p=660602#660602 hatte ich schonmal bei einer ähnlichen Frage die Lösung gepostet (nur daß du dann anstatt CheckBox dann TextBox nehmen müsstest).


SubZero - Fr 15.03.13 12:26

Danke für deine Antwort!

Sowas änliches hab ich schonmal gefunden, aber ich bekomm das nicht hin.
Steck da leider zu wenig in der Materie.

so ähnlich xD

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
foreach (Control control in this.Controls)
{
    TextBox textBox = control as TextBox;
    if (textBox.text == "false")
    {
        textBox.ForeColor = Color.Red;
    }
}


Quelltext
1:
2:
Fehler  1  "System.Windows.Forms.TextBox" enthält keine Definition für "text", und es konnte keine Erweiterungsmethode "text" gefunden werden,
           die ein erstes Argument vom Typ "System.Windows.Forms.TextBox" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)


Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Ralf Jansen - Fr 15.03.13 12:32

Die ganze Sprache ist Casesensitiv. Alle Eigenschaften, Methoden etc. einer Klasse werden üblicherweise groß geschrieben und so auch die Text Property.


SubZero - Fr 15.03.13 13:26

sry mein fehler^^

habs geändert und bekomm aber jetzt den Fehler
"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
foreach (Control control in this.Controls)
{
    TextBox textBox = control as TextBox;
    if (textBox.Text == "false")
        textBox.ForeColor = Color.Red;
    else if (textBox.Text == "true")
        textBox.ForeColor = Color.Green;
    else
        textBox.ForeColor = Color.Black;
}


Th69 - Fr 15.03.13 13:50

Hallo SubZero,

es fehlt ja auch noch die Abfrage, ob die Umwandlung (cast) mittels as erfolgreich war:

C#-Quelltext
1:
2:
3:
4:
if (textBox != null)
{
    // ...
}


Ralf Jansen - Fr 15.03.13 13:51

Nicht jedes Control ist auch eine TextBox. Durch das casten der Controls augf textBox werden diejenigen zu null die keine Textboxen sind und du bekommst die von dir genannte Fehlermeldung wenn du irgendwas aufrufen willst an einem NULL Ding (z.B die Text Property).

Du must also erst Testen ob das Control auch eine TextBox war.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
foreach (Control control in this.Controls)
{
    TextBox textBox = control as TextBox;
    if (textBox != null)
    {
        if (textBox.Text == "false")
            textBox.ForeColor = Color.Red;
        else if (textBox.Text == "true")
            textBox.ForeColor = Color.Green;
        else
            textBox.ForeColor = Color.Black;
    }  
}


Übrigens sieh dir nochmnal das verlinkte Thema von user profile iconTh69 an. Die Verwendung von OfType<> löst das eleganter.


SubZero - Fr 15.03.13 14:16

jetz läuft der befehl durch aber er entdeckt nicht was darin steht, also das false oder true.
was hab ich denn jetzt noch falsch -.-


Ralf Jansen - Fr 15.03.13 21:21

Das sollte funktionieren. Wenn nicht wäre die Gegenfrage wo, wann und wie setzt du denn Code denn ein?


Christoph1972 - Fr 15.03.13 22:55

So geht es auch noch:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
foreach (Control c in this.Controls)
{
    if(c.GetType() == typeof(Button))
    {
        c.Text = "test";             
    }
}


Aber die Methode von Th69 ist am schönsten.

Gibt es noch weitere Möglichkeiten? :D


jfheins - Sa 16.03.13 14:33

Vielleicht so:

C#-Quelltext
1:
2:
foreach (Button c in this.Controls.OfType<Button>())
        c.Text = "test";

Finde ich jetzt persönlich ziemlich schick :)

Edit: Achso, das war mit "Aber die Methode von Th69 ist am schönsten." gemeint. bin dem Link nicht gefolgt... :oops:


Christoph1972 - Sa 16.03.13 18:08

Einen habe ich noch:


C#-Quelltext
1:
this.Controls.OfType<Button>().ToList().ForEach(button=>button.Text  = "test1");                    


Gibt es noch eine Möglichkeit?


DarkStaRX - Sa 30.03.13 01:55


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
foreach (Control item in Controls)
{
    if(item is TextBox)
    {
      if(item.Text == "false")
        item.ForeColor = Color.Red;
      else
        item.ForeColor = Color.Green;
    }

}



So müsste es auch funktionieren