VisualStudio Arrays |
21.06.2014, 10:51 | Auf diesen Beitrag antworten » | |||||||||||||||||||
kein_plan | VisualStudio Arrays Meine Frage: Hallo, ich möchte in VisualStudio folgendes machen: Ich habe eine Windows-Forms-Anwendung gestartet und dort mehrere Textboxen erstellt (insgesamt 81 Stück). Jetzt möchte ich die Texte in diesen Textboxen auslesen und in ein Array schreiben. Wie kann ich das am schnellsten machen? Ich könnte natürlich schreiben:
Aber das ist ja ewig lange Tipperei. Außerdem müsste ich auch noch jedes mal abfragen, ob die Textbox leer ist, sodass ich dann auf ca. 400 Codezeilen kommen würde. Gibt es da noch eine bessere Möglichkeit? Meine Ideen: |
|||||||||||||||||||
|
||||||||||||||||||||
21.06.2014, 11:31 | Auf diesen Beitrag antworten » | |||||||||||||||||||
as_string | Hallo! Ich habe leider keine Ahnung von Windows-Forms und auch keine von C# (das ist C#-Syntax, oder), aber zwei Dinge dazu trotzdem: Du deklarierst ein int-Array. Warum int? Du willst doch offenbar Strings speichern. So was kann man eigentlich nur besser machen, wenn man die Text-Boxen schon als Array definiert. Irgendwann werden die doch angelegt (ich vermute allerdings, das wird Code sein, den Visual Studio und nicht Du selbst geschrieben hast...) Da kann man ja statt einzelner Variablen textBox1, textBox2... sicherlich auch schon ein Array von 81 Textboxen anlegen und entsprechend initialisieren. Dann ist es nämlich nachher einfach, alle diese Textboxen auch wieder über eine Schleife abzuarbeiten. Ansonsten könnte es auch sein, dass Windows-Forms die Möglichkeit bietet, ein Array (oder eine Liste) aller registrierten Textboxen zu liefern. Dann hättest Du auch wieder so ein Array, allerdings wären dann wirklich alle Textboxen drin, auch wenn Du in Zukunft noch eine dazu machst. Ob Du das immer willst, ist die andere Frage, und dann wieder zu versuchen, die passenden auszufiltern, ist sicherlich auch nicht die beste Lösung. Gruß Marco |
|||||||||||||||||||
21.06.2014, 11:33 | Auf diesen Beitrag antworten » | |||||||||||||||||||
as_string | Zum letzten Gedanken habe ich mal kurz gegooglet und das hier gefunden: http://stackoverflow.com/questions/3419159/how-to-get-all-child-controls-of -a-windows-forms-form-of-a-specific-type-button Ob das weiter hilft? Gruß Marco edit: hier noch was:
von dieser Seite hier: http://bytes.com/topic/c-sharp/answers/266064-how-can-i-retrive-all-textbox -windows-form |
|||||||||||||||||||
21.06.2014, 15:16 | Auf diesen Beitrag antworten » | |||||||||||||||||||
eulerscheZahl | Bei 81 TextBoxen muss ich gerade an Sudoku denken, da könnte man auch ein zweidimensionales Array von TextBoxen zur Laufzeit erzeugen. Noch etwas mehr Code:
|
|||||||||||||||||||
Anzeige | ||||||||||||||||||||
|
||||||||||||||||||||
22.06.2014, 10:20 | Auf diesen Beitrag antworten » | |||||||||||||||||||
kein_plan |
Ich wandle dann beim Einlesen die Strings in int-Zahlen um.
Richtig gedacht. Vielen Dank, du hast mir sehr geholfen (und sehr viel Schreibkram erspart). Noch ein paar Fragen:
Ich möchte abfragen, ob eine Textbox leer ist; und wenn ja, irgendwelche Anweisungen ausführen. Kann ich dazu statt Zeile 21 folgendes schreiben?
Zu Zeile 12: Was hat
Und den Sinn der letzten Methode private int[] readTextBoxes() habe ich auch nicht wirklich verstanden. Wozu ist die da und was macht die? Wär nett, wenn du mir da nochmal helfen könntest. Viele Grüße |
|||||||||||||||||||
22.06.2014, 10:53 | Auf diesen Beitrag antworten » | |||||||||||||||||||
eulerscheZahl |
richtig
schon wieder richtig. tb[i].Parent = this; bewirkt, dass die TextBox auf this, also vermutlich deiner Windows Form platziert werden. Wenn du den Code ohne diese Zeile ausführst, existieren die TextBoxen zwar, der Nutzer kann sie aber nicht sehen.
Marco hat ja bereits erwähnt, dass man entweder die TextBoxen zur Laufzeit erzeugen kann, was das auslesen vereinfacht - oder über die vorhandenen Controls iterieren. Der einfachere Weg ist sicher readTextBoxes(TextBox[] tb). Hier musst du dir keine Gedanken mehr machen, wie du an die TextBoxen kommst, du übergibst sie ja an die Funktion. Wenn das Kind aber schon in den Brunnen gefallen ist (die die Boxen alle mit der Maus in den Designer gezogen hast), kannst du den Inhalt mit readTextBoxes() trotzdem noch auslesen. Brauchst du aber nicht, wenn du die Erzeugung zur Laufzeit machst. Oder eben gleich als zweidimensionales Array:
|
|||||||||||||||||||
22.06.2014, 16:31 | Auf diesen Beitrag antworten » | |||||||||||||||||||
kein_plan | OK. Danke euch beiden. |
|||||||||||||||||||
22.06.2014, 21:02 | Auf diesen Beitrag antworten » | |||||||||||||||||||
kein_plan | Es sind doch noch Fragen aufgetaucht: Die Funktion createSudokuField() rufe ich so auf:
Dieses gibt ja ein Array zurück, das ich natürlich auch speichern kann. Wie kann ich dieses Array dann der Funktion readTextBoxes(TextBox[] tb) übergeben (denn das Array existiert ja erstmal nur in public Form1())? Und die Funktion readTextBoxes(TextBox[] tb) soll erst beim Klicken eines Buttons ausgeführt werden. Ich könnte ja ein globales Array definieren und da dann den Rückgabewert von createSudokuField() schreiben, aber globale Variablen sollen doch eigentlich vermieden werden, oder? Außerdem wollte ich bei den Textboxen die Werte in Font und ändern, z.B.:
Da kommt dann aber die Fehlermeldung: "Einer Eigenschaft oder einem Indexer 'System.Drawing.Font.Bold' kann nichts zugewiesen werden - sie sind schreibgeschützt". Irgendwie muss man doch diese Eigenschaften ändern können... |
|||||||||||||||||||
22.06.2014, 21:48 | Auf diesen Beitrag antworten » | |||||||||||||||||||
eulerscheZahl | globale Variablen sollte man vermeiden, wenn man sie nicht unbedingt braucht, aber ich würde nicht soweit gehen, prinzipiell von der Verwendung abzuraten. Hier halte ich es für vertretbar, spontan fällt mir dazu auch keine Alternative ein. Versuche für die Schrift das hier: tb[x, y].Font = new Font("Times New Roman", 16, FontStyle.Bold | FontStyle.Italic); |
|
Verwandte Themen
Die Beliebtesten » |
Die Größten » |
Die Neuesten » |
|