Autor |
Beitrag |
chris300695
      
Beiträge: 17
|
Verfasst: Do 01.12.11 12:22
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
      
Beiträge: 178
Erhaltene Danke: 21
|
Verfasst: Do 01.12.11 13: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 
      
Beiträge: 17
|
Verfasst: Do 01.12.11 13: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
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 01.12.11 13: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.
C#-Quelltext
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 
      
Beiträge: 17
|
Verfasst: Do 01.12.11 14:10
danke für die Antwort.
Könntest du vielleicht noch den Quelltext für die Liste schreiben?
|
|
lothi
      
Beiträge: 114
Erhaltene Danke: 3
|
Verfasst: Do 01.12.11 14:42
Hallo chris300695
Ich nehme mal dem Moderator die Arbeit ab.
Was und wie es funktioniert mit der Liste steht hier:
List<T>
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 
      
Beiträge: 17
|
Verfasst: Do 01.12.11 15: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
      
Beiträge: 114
Erhaltene Danke: 3
|
Verfasst: Do 01.12.11 15: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 
      
Beiträge: 17
|
Verfasst: Do 01.12.11 20: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
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 01.12.11 20: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 
      
Beiträge: 17
|
Verfasst: Fr 02.12.11 14: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
      
Beiträge: 110
Erhaltene Danke: 13
XP
C/C++/C#
|
Verfasst: Fr 02.12.11 14: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
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 02.12.11 16:02
Benutze besser die Double.TryParse()-Methode, welche als 'bool' zurückgibt, ob überhaupt ein Double-Wert in dem übergebenen Text enthalten ist.
|
|
chris300695 
      
Beiträge: 17
|
Verfasst: Fr 02.12.11 19: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(); |
|
|
Th69
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 02.12.11 20:33
Bitte schau dir die Parameter und den Rückgabewert mal in der MSDN an: Double.TryParse
|
|
chris300695 
      
Beiträge: 17
|
Verfasst: Fr 02.12.11 21: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
      
Beiträge: 102
Erhaltene Danke: 12
|
Verfasst: Fr 02.12.11 21:34
|
|
chris300695 
      
Beiträge: 17
|
Verfasst: Fr 02.12.11 21: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
      
Beiträge: 102
Erhaltene Danke: 12
|
Verfasst: Fr 02.12.11 21: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
      
Beiträge: 110
Erhaltene Danke: 13
XP
C/C++/C#
|
Verfasst: Sa 03.12.11 10: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ß
|
|