Autor Beitrag
chris300695
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 178
Erhaltene Danke: 21



BeitragVerfasst: Do 01.12.11 13:01 
ausblenden C#-Quelltext
1:
2:
TextBox neue =new TextBox();
this.Controls.Add(neue);


Moderiert von user profile iconTh69: C#-Tags hinzugefügt - bitte demnächst selber hinzufügen
chris300695 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 01.12.11 13:16 
Du solltest natürlich auch die Position anpassen (sonst liegen alle TextBoxen übereinander):
ausblenden 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.
ausblenden C#-Quelltext
1:
int y = 50;					


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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 01.12.11 14:10 
danke für die Antwort.
Könntest du vielleicht noch den Quelltext für die Liste schreiben?
lothi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 114
Erhaltene Danke: 3



BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
List<TextBox> textboxen = new List<TextBox>();

// Dann im Click Ereignis des Buttons:

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 user profile iconTh69: Code- durch C#-Tags ersetzt
chris300695 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 114
Erhaltene Danke: 3



BeitragVerfasst: Do 01.12.11 15:30 
user profile iconchris300695 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: 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:

ausblenden 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 user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: 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:


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110
Erhaltene Danke: 13

XP
C/C++/C#
BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Fr 02.12.11 19:00 
funktioniert beides nicht....

Hier der Code:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 02.12.11 20:33 
Bitte schau dir die Parameter und den Rückgabewert mal in der MSDN an: Double.TryParse
chris300695 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 102
Erhaltene Danke: 12



BeitragVerfasst: Fr 02.12.11 21:34 
user profile iconchris300695 hat folgendes geschrieben Zum zitierten Posting springen:
Ich krieg es einfach nicht hin :)


Was denn genau? In der verlinkten MSDN sind doch genügend Beispiele.
chris300695 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Fr 02.12.11 21:38 
Ich hab gedacht, dass ich das so machen muss:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 102
Erhaltene Danke: 12



BeitragVerfasst: Fr 02.12.11 21:50 
user profile iconchris300695 hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110
Erhaltene Danke: 13

XP
C/C++/C#
BeitragVerfasst: 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..

ausblenden 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, nullout 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ß