Software für Autohaus

04/13/2014 17:41 SurizeZaine#1
Hey Leute,
bin gerade dabei eine Software für das Autohaus meines Vaters zu schreiben.

Funktionen der Software:

- Anhand von Eingaben in Textboxen ein formatiertes Datenblatt erstellen
- Dieses Datenblatt im RTF Format speichern
- Anhand von Eingaben in Textboxen vorgefertigte Modelle mit einer bestimmten Ausstattung/Technischen Daten zu erstellen bzw. diese zu speichern
- Diese gespeicherten Modelle können per OpenFileDialog geöffnet werden -> Die Textboxen der Windows Form werden beim Öffnen automatisch mit den Daten des gespeicherten Modells ausgefüllt -> man muss dann z.b. nur die Farbe in der Textbox ändern und kann ein neues Datenblatt erstellen mit der selben Ausstattung/den selben Technischen Daten
- Button "Alle Eingaben löschen": Die Eingaben aller Textboxen werden gelöscht, falls man z.b. mehrere Modelle hintereinander anlegen möchte, damit man nicht jede Textbox per Hand ändern/neu eingeben muss

Soweit, so gut. Der letztgenannte Punkt bereitet mir allerdings ein paar Probleme.

So wollte ich es umsetzen:

Code:
foreach (Control c in Controls)
{
   if (c is Textbox)
   c.Text = String.Empty;
}
Problem ist, dass er keine Textbox löscht. Wenn ich eine Textbox einzeln aufrufe klappt es aber:

Code:
textBox1.Text = String.Empty;
Ich habe das Problem jetzt vorrübergehend so gelöst, indem ich ein Array mit allen TextBoxen erstelle und jede TextBox per Schleife einzeln aufrufe und ihren Inhalt lösche:

Code:
TextBox[] arr = {textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, textBox7, textBox8, textBox9, textBox10, textBox11, textBox12, textBox13, textBox14, textBox15, textBox16, textBox17, textBox18, textBox19, textBox20, textBox21,textBox22, textBox23, textBox24, textBox25, textBox26, textBox27, textBox28, textBox29, textBox30 };

for (int i = 0; i <= 29; i++)
                {
                    arr[i].Text = string.Empty;
                }
Klappt jetzt auch alles, allerdings ist das nicht sehr schön finde ich. Die erstgenannte Methode per foreach-Schleife wäre mir lieber. Könnt ihr mir auf die Sprünge helfen, warum die erste Methode nicht funktioniert?
Zur Info: Die Textboxen befinden sich alle im splitContainer1.Panel1, der Löschen-Button im splitContainer1.Panel2

Grüße und danke im Vorraus :)
04/13/2014 18:20 Tim87'#2
Hey,

Ich habe mir dein Post nur flüchtig durchgelesen, werde Dir in ferner Zukunft, also in 2 Tagen oder so nochmal ein genaueres Feedback (Lösung) geben - nur noch ein gut gemeinter Rat, fange ALLE Fehlermeldungen mit Catch ab!

Gerade bei einem solchen Programm ist das seeeeeeeeehr wichtig!
04/13/2014 18:53 Mostey#3
Code:
        public static IEnumerable<T> GetControlsOfType<T>(Control root) where T : Control
        {
            var t = root as T;
            if (t != null)
                yield return t;

            var container = root as ContainerControl;
            if (container != null)
                foreach (Control c in container.Controls)
                    foreach (var i in GetControlsOfType<T>(c))
                        yield return i;
        }
[Only registered and activated users can see links. Click Here To Register...]

Funktioniert bestens und du hast sogar die Garantie, das auch durch Nested Controls iteriert wird.

Um trotzdem zu dem Snippet zurückzukommen:

Du müsstest hier einen Compilerfehler angezeigt bekommen da Textbox so nicht existiert, sofern du nicht explizit eine Instanz mit dem Namen erstellt hast. Deine Methode funktioniert prima, wenn du den Klassennamen richtig schreibst (also TextBox). Findet allerdings dann keine Nested Controls.

Bedeutet also, das durch Textboxen in einem Container (Panel, was weiß ich) nicht iteriert wird.
04/13/2014 19:03 SurizeZaine#4
Hey, schonmal vielen Dank für die beiden Antworten, werde es nacher einmal probieren. Das mit Textbox war natürlich nur ein Schreibfehler von mir, im richtigen Code habe ich TextBox geschrieben.
04/13/2014 19:28 Mostey#5
Quote:
Originally Posted by SurizeZaine View Post
Hey, schonmal vielen Dank für die beiden Antworten, werde es nacher einmal probieren. Das mit Textbox war natürlich nur ein Schreibfehler von mir, im richtigen Code habe ich TextBox geschrieben.
Dann waren diese in einem Container. Sonst hätte es nämlich funktioniert.