Entwickler-Ecke
WinForms - beliebige Anzahl von TextBoxen zur Laufzeit erstellen
chris300695 - Do 01.12.11 11:22
Titel: beliebige Anzahl von TextBoxen zur Laufzeit erstellen
Hallo zusammen,
ich bin noch en relativer Anfänger was C# angeht, deshalb mein Problem:
wenn ich einen Button anklicke, soll eine TextBox erstellt werden. Das ist ja auch kein Problem. Jedoch möchte ich, dass jedesmal bei einem Klick eine weitere TextBox erstellt wird. So dass dann z.B. 3 textBoxen erstellt werden, wenn ich den Button dreimal klicke.
ich hoffe ihr könnt mir helfen.
Danke schonmal im Voraus.
Chris
dark-destination1988 - Do 01.12.11 12:01
C#-Quelltext
1: 2:
| TextBox neue =new TextBox(); this.Controls.Add(neue); |
Moderiert von
Th69: C#-Tags hinzugefügt - bitte demnächst selber hinzufügen
chris300695 - Do 01.12.11 12:06
wenn ich das aber so schreibe, wird auch beim Buttonklick eine TextBox erstellt. Wenn ich aber ein zweites mal auf den Button klicke, bleibt es bei der einen TextBox und es wird keine zweite hinzugefügt, wie ich das gerne hätte.
Th69 - Do 01.12.11 12:16
Du solltest natürlich auch die Position anpassen (sonst liegen alle TextBoxen übereinander):
C#-Quelltext
1: 2: 3: 4:
| TextBox textbox = new TextBox(); textbox.Position = new Point(20, y); y += 30; this.Controls.Add(textpos); |
Und y sollte dann eine Membervariable deiner Form-Klasse sein (und entsprechend initialisiert), z.B.
P.S. Wenn du programmtechnisch auch auf alle TextBoxen zugreifen willst, dann solltest du diese zusätzlich in einer eigenen Liste (List<TextBox>) speichern.
chris300695 - Do 01.12.11 13:10
danke für die Antwort.
Könntest du vielleicht noch den Quelltext für die Liste schreiben?
lothi - Do 01.12.11 13:42
Hallo chris300695
Ich nehme mal dem Moderator die Arbeit ab.
Was und wie es funktioniert mit der Liste steht hier:
List<T> [
http://msdn.microsoft.com/de-de/library/6sh2ey19.aspx]
Bei dir würde das in etwa so aussehen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| List<TextBox> textboxen = new List<TextBox>();
TextBox textbox = new TextBox(); textbox.Position = new Point(20, y); y += 30; textboxen.Add(textbox); this.Controls.Add(textpos); |
So wird jede einzelne TextBox in der Liste gespeichert und da kannst du mit einer Schleife die einzelnen Textboxen auslesen. Willst du bestimmte textBoxen nacher suchen, kannst du dafür die Tag Eigenschaft des Controls benutzen.
Gruss Lothi
Moderiert von
Th69: Code- durch C#-Tags ersetzt
chris300695 - Do 01.12.11 14:09
Habe das jetzt soweit übernommen, sieht auch ganz gut aus.
Nachdem die TextBoxen erstellt wurden, sollen alle zusammen addiert werden. Das Ergebnis soll dann einer Variablen zugewiesen werden. Hab gedacht, dass ich dafür eine foreach-Schleife nehme.
Wie kann ich das am besten lösen?
lothi - Do 01.12.11 14:30
chris300695 hat folgendes geschrieben : |
Habe das jetzt soweit übernommen, sieht auch ganz gut aus.
... Hab gedacht, dass ich dafür eine foreach-Schleife nehme.
Wie kann ich das am besten lösen? |
Hallo
Sobald du etwas gedacht hast, musst du es auch ausprobieren. Wenn es nicht geht poste deinen Code und stelle die Fragen.
Sonst wirst du mit deinem Programm nie fertig.
Gruss Lothi
chris300695 - Do 01.12.11 19:15
habs jetzt nochmal probiert.
Jetzt habe ich wieder dasselbe Problem wie am Anfang. Da kommt, egal wie oft ich auf den Button klicke, nur eine TextBox.
Der Quellcode:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| private void button1_Click(object sender, EventArgs e) { int y = 50; TextBox textbox = new TextBox(); textbox.Location = new Point(20, y); y += 30; this.Controls.Add(textbox); } |
Was ist falsch daran?
Moderiert von
Th69: C#-Tags hinzugefügt
Th69 - Do 01.12.11 19:55
Hallo Chris,
wie schon heute nachmittag geschrieben, muß 'y' außerhalb der Methode als Membervariable deiner Formklasse definiert werden (ansonsten wird die Variable 'y' ja immer wieder innerhalb deiner Methode initialisiert).
chris300695 - Fr 02.12.11 13:17
Super, es klappt.
die TextBoxen werden bei Buttonklick der Form hinzugefügt.
Der nächste Schritt, den ich nun machen will:
Ich möchte, dass alle erstellten Textboxen einer Variablen zugewiesen werden. Dabei sollen sie zusammen addiert werden. Das Ergebnis, sprich die Variable (hier: double gesamt), soll in der textbox2 ausgegeben werden.
Mein Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| double gesamt = 0;
foreach (TextBox i in textboxen) { gesamt += i.Text }
textbox2.text = gesamt.ToString(); |
Das funktioniert nicht. Was mache ich falsch?
Dr. Hallo - Fr 02.12.11 13:33
wenn ich nicht irre, ist i.Text ein string. den musst du explizit nach double casten. das machst du mit Convert.ToDouble(). also
C#-Quelltext
1:
| Convert.ToDouble(i.Text) |
idealerweise solltest du vorher noch prüfen, ob sich der text überhaupt in ein double casten lässt.
gruß
Th69 - Fr 02.12.11 15:02
Benutze besser die Double.TryParse()-Methode, welche als 'bool' zurückgibt, ob überhaupt ein Double-Wert in dem übergebenen Text enthalten ist.
chris300695 - Fr 02.12.11 18:00
funktioniert beides nicht....
Hier der Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| double gesamt = 0;
foreach (TextBox i in textboxen) { gesamt += Double.TryParse(i.Text); }
textBox2.Text = gesamt.ToString(); |
chris300695 - Fr 02.12.11 20:09
Ich krieg es einfach nicht hin :) könnte einer von euch bitte einen Quellcode für die Double.TryParse-Methode schreiben?
Wäre sehr dankbar dafür.
Grüße
Chris
ujr - Fr 02.12.11 20:34
chris300695 hat folgendes geschrieben : |
| Ich krieg es einfach nicht hin :) |
Was denn genau? In der verlinkten MSDN sind doch genügend Beispiele.
chris300695 - Fr 02.12.11 20:38
Ich hab gedacht, dass ich das so machen muss:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| double gesamt = 0;
foreach (TextBox i in textboxen) { if (Double.TryParse(i.Text, out gesamt)) gesamt += Convert.ToDouble(i.Text); else MessageBox.Show("Sorry"); }
textBox2.Text = gesamt.ToString(); |
funktioniert aber nicht.
ujr - Fr 02.12.11 20:50
chris300695 hat folgendes geschrieben : |
| Ich hab gedacht, dass ich das so machen muss: |
Lies Dir doch mal die Dokumentation richtig durch - aus TryParse kommt doch über "out" der gewandelte Wert heraus - "gesamt" wird also immer wieder überschrieben. Und Convert.ToDouble ist gar nicht mehr nötig.
Nebenbei: "funktioniert nicht" ist keine sehr aussagekräftige Fehlermeldung.
Dr. Hallo - Sa 03.12.11 09:26
wie schon ujr schieb, wird ja deine variable gesamt durch out bei jedem schleifendurchlauf überschrieben. du brauchst also für tryparse eine extravariable und auf convert.todouble kannst du verzichten, guckste..
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| double gesamt = 0; double wert = 0;
foreach (TextBox i in textboxen) { if (Double.TryParse(i.Text, NumberStyles.Float, null, out wert)) gesamt += wert; else MessageBox.Show("Sorry"); }
textBox2.Text = gesamt.ToString(); |
bin mir nicht sicher, ob die zusätzlich parameter in tryparse unbeding angegeben werden müssen. bei der darstellung von gleitkommazahlen gibt es kulturelle unterschiede. das betrifft vor allem den separator. wenn man tryparse so verwendet wird die vom aktuellen thread verwendete kultur verwendet.
ich würde aber empfehlen erst alle felder in einer schleife mit trypase auf gültigkeit zu prüfen und erst dann in einer zweiten schleife die berechnung mit convert.todouble zu machen. es sei denn du willst absichlich einige felder leer und damit unberücksichtigt lassen.
gruß
chris300695 - Sa 03.12.11 11:11
Also ich hab das gestern so gemacht:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| double gesamt = 0; double zahl1;
foreach (TextBox i in textboxen) { Double.TryParse(i.Text, out zahl1); gesamt += zahl1; }
gesamt += gehalt; textBox2.Text = gesamt.ToString(); |
und es funktioniert :). Danke.
Jetzt will ich aber noch ein Button hinzufügen, der das der list "textboxen" zuletzt hinzugefügte Element entfernt.
Mein Quellcode:
C#-Quelltext
1: 2: 3: 4:
| private void button9_Click(object sender, EventArgs e) { textboxen.RemoveAt(textboxen.Count - 1); } |
Es tut sich aber nichts, wenn ich den Button9 anklicke.
Th69 - Sa 03.12.11 11:31
Hallo Chris,
du mußt die TextBox natürlich auch noch aus der Form.Controls-Collection löschen (denn diese wird ja angezeigt).
Wenn du weitere Fragen dazu hast, bitte erstelle dafür dann einen neuen Beitrag, danke.
P.S. Du solltest deine TryParse-Methode noch mit einem 'if' versehen (so wie "Dr. Hallo" schon geschrieben hat) - ansonsten kriegst du unerwartete Ergebnisse für 'gesamt' (falls in einer TextBox keine Zahl steht).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!