Entwickler-Ecke

Sonstiges (.NET) - TextBox in List<T> übertragen


spitzname - Fr 02.07.10 15:21
Titel: TextBox in List<T> übertragen
Hallo, ich habe folgende Frage:
wie kann man aus einer TextBox(txtEingabe) jede einzelne Person in die PersonenGruppe(ArrayList) aufnehmen.

hier sind die Klassen, die ich verwende:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
class Person
    {

        private string nachname;
        private string vorname;
        private long ID;

        public Person(string name, string v_nahme, long ID)
        {
            nachname = name;
            vorname = v_nahme;
            this.ID = ID;
        }


        public string Nachname
        {
            get { return nachname; }
            set
            {
                this.nachname = value;             
            }
        }


        public string Vorname
        {
            get { return vorname; }
            set
            {
                this.vorname = value;
            }
        }


        public long ID_Nummer
        {
            get { return ID; }
            set
            {
                this.ID = value;
            }
        }
    }



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public class PersonenGruppe
{
    public List<Person> Personen{get;private set;}

    public PersonGruppe()
    {
        this.Personen = new List<Person>();
    }

}



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
public partial class FrmPersonVerwaltung : Form
    {

        private PersonenGruppe speicher = new PersonenGruppe(); 

        public FrmPersonVerwaltung()
        {
            InitializeComponent();
        }

        private void btnLoad_Click(object sender, EventArgs e)
        {
            
            DialogResult dlgAntwort;
            dlgAntwort = dlgLoad.ShowDialog();
            Person p = new Person();

            if (dlgAntwort == DialogResult.Cancel)
                return;
            try
            {
                StreamReader src = new StreamReader(dlgLoad.FileName);

                txtEingabe.Text = src.ReadToEnd();
                src.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Fehler 1 " + ex.Message);
            }           
                //das klappt schon mal          
                p.Nachname = txtEingabe.Lines[0];
                p.Vorname = txtEingabe.Lines[1];
                p.Id = Convert.ToInt64(txtEingabe.Lines[2]);
                speicher.Personen.Add(p);
        }
}


Mit der Funktion "private void btnLoad_Click(object sender, EventArgs e)" in der "class FrmPersonVerwaltung"
kann man eine Textdatei in die Textbox("txtEingabe") aufnehmen und dann aus Textbox("txtEingabe") die Daten Zeilenweise in die ArrayList speichern.
Es werden also in dem Beispiel erstmal die Daten von einer Person (Zeilen 1 -> Nachname, 2 -> Vorname und 3 ->ID) in ArrayList gespeichert.

Die Textbox("txtEingabe") und die Textdatei hat fogenden Aufbau:

Beispiel:

Petersen
Peter
123
Leerzeile

u.s.w

also erste Zeile Vorname, zweite Nachname, dritte ID, vierte Leerzeile.

Frage:Wie kann man nicht nur die ersten drei Zeilen sondern alle Zeilen also mehrere Personen aus der TextBox(txtEingabe) übernehmen?

würde mich über jede Hilfe freuen

gruß

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Fr 02.07.2010 um 15:23


JüTho - Fr 02.07.10 19:10

Es scheint mir abwegig zu sein, eine ArrayList zu benutzen, wenn auch List<Person> zur Verfügung steht, und dann auch noch die Einzelteile hintereinander zu schreiben. Du solltest über dein Konzept nochmal nachdenken.

Jürgen


spitzname - Fr 02.07.10 19:59

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Es scheint mir abwegig zu sein, eine ArrayList zu benutzen, wenn auch List<Person> zur Verfügung steht, und dann auch noch die Einzelteile hintereinander zu schreiben. Du solltest über dein Konzept nochmal nachdenken.

Jürgen


Hallo, erstmal danke für die Antwort, ja Stimmt ich habe natürlich die List<Person> und nicht ArrayList gemeint. Wie meinst du das "Einzelteile hintereinander" ? Ist mein Ansatz komplet falsch?


gruß


Christian S. - Fr 02.07.10 20:22

Hallo!

Statt mit dem StreamReader würde ich mit File.ReadAllLines arbeiten, dann kannst Du das daraus resultierende Array durchlaufen und entsprechend neue Personen anlegen.

Grüße
Christian


Th69 - Fr 02.07.10 20:22

Ich wiederhole hier noch mal das Stichwort (das herbivore in dem anderen C#-Forum schon erwähnt hat): Schleife -)


spitzname - Fr 02.07.10 22:17

Ok, also mit File.ReadAllLines und Schleife:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
 private void btnLoad_Click(object sender, EventArgs e)
        {
            
            DialogResult dlgAntwort;
            dlgAntwort = dlgLoad.ShowDialog();
            Person p = new Person();

            if (dlgAntwort == DialogResult.Cancel)
                return;
            try
            {
                string[] lines = File.ReadAllLines(dlgLoad.FileName);
                

                    for (int i = 0; i < lines.Length; i++)
                    {                    
                            speicher.Nachname = lines[i];
                            i = i + 1;
                            speicher.Vorname = lines[i];
                            i = i + 2;
                            speicher.ID = Convert.ToInt64(lines[i]);
                    }  

            }
            catch (Exception ex)
            {
                Console.WriteLine("Fehler 1 " + ex.Message);
            }

            txtEingabe.AppendText(Environment.NewLine + speicher.Personen);
       
        }


Es klappt leider aber trotzdem noch nicht :( , wo liegt mein Fehler bitte um Tipps.

gruß

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Christian S. - Fr 02.07.10 22:37

Was heißt denn "klappt nicht"?

//edit: Und wieso benutzt Du Speicher, als sei es eine Person, das ist doch eine Personengruppe?


spitzname - Fr 02.07.10 22:56

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Was heißt denn "klappt nicht"?

//edit: Und wieso benutzt Du Speicher, als sei es eine Person, das ist doch eine Personengruppe?



Ja stimmt, ich glaube ich muss mal Pause machen!

Ok noch ein Versuch:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
 private void btnLoad_Click(object sender, EventArgs e)
        {
            
            DialogResult dlgAntwort;
            dlgAntwort = dlgLoad.ShowDialog();
            Person p = new Person();

            if (dlgAntwort == DialogResult.Cancel)
                return;
            try
            {
                string[] lines = File.ReadAllLines(dlgLoad.FileName);
                
                    //Die forschleife hat folgenden Algorithmus (erste Zeile, zweite, dritte speichern und 
                    //vierte auslassen dann fünfte,sechste,siebte Zeile speichern achte auslassen u.s.w
                    for (int i = 0; i < lines.Length; i=i+4)
                    {                    
                            p.Nachname = lines[i];
                            i = i + 1;
                            p.Vorname = lines[i];
                            i = i + 2;
                            p.ID = Convert.ToInt64(lines[i]);
                           
                    }  

            }
            catch (Exception ex)
            {
                Console.WriteLine("Fehler 1 " + ex.Message);
            }

            txtEingabe.AppendText(Environment.NewLine + speicher.Personen);
       
        }


Christian S. - Fr 02.07.10 22:59

Du hast immer noch nicht beschrieben, was nicht klappt.

Aber so, wie ich das sehe, fügst Du der Personengruppe nie irgendwas hinzu ;-)


Kha - Fr 02.07.10 23:27

Außerdem würde ich die Werte von i noch einmal im Kopf durchgehen, auf +4 pro Durchgang kommt das jedenfalls nicht hinaus ;) .


spitzname - Fr 02.07.10 23:29

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Du hast immer noch nicht beschrieben, was nicht klappt.

Aber so, wie ich das sehe, fügst Du der Personengruppe nie irgendwas hinzu ;-)


Das stimmt auch wieder also:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
 private void btnLoad_Click(object sender, EventArgs e)
        {
            
            DialogResult dlgAntwort;
            dlgAntwort = dlgLoad.ShowDialog();
            Person p = new Person();

            if (dlgAntwort == DialogResult.Cancel)
                return;
            try
            {
                string[] lines = File.ReadAllLines(dlgLoad.FileName);
                

                    for (int i = 0; i < lines.Length; i=i+2)
                    {                    
                            p.Nachname = lines[i];
                            i = i + 1;
                            p.Vorname = lines[i];
                            i = i + 2;
                            p.ID = Convert.ToInt64(lines[i]);
                            
                    }  

            }
            catch (Exception ex)
            {
                Console.WriteLine("Fehler 1 " + ex.Message);
            }
            speicher.Personen.Add(s);
            
            txtEingabe.AppendText(speicher.Personen[0]+Environment.NewLine );
             txtEingabe.AppendText(speicher.Personen[1]+Environment.NewLine );
        }


Text:
petersen
Peter
1

Hansen
Hans
2

Fehlermeldung:
Eine nicht behandelte Ausnahme des Typs "System.ArgumentOutOfRangeException" ist in mscorlib.dll aufgetreten.

Zusätzliche Informationen: Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.


Was mache ich falsch?

gruß

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Christian S. - Fr 02.07.10 23:43

Du springst von Vorname zu ID zwei Zeilen weiter.

Du fügst der Personengruppe jetzt einmalig nach der Schleife was[1] hinzu. Sinnvoll?



[1]Irgendein "s", was sonst nirgendwo benutzt wird. Sinnvoll?


spitzname - Sa 03.07.10 00:01

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Du springst von Vorname zu ID zwei Zeilen weiter.

Du fügst der Personengruppe jetzt einmalig nach der Schleife was[1] hinzu. Sinnvoll?



[1]Irgendein "s", was sonst nirgendwo benutzt wird. Sinnvoll?


Nein es ist nicht Sinvoll, also nochmal die forschleife:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
for (int i = 0; i < lines.Length; i = i +4 )
                    {
                        s.Nachname = lines[i];
                        i = i + 1;
                        s.Vorname = lines[i];
                        i = i + 1;
                        s.Matrnummer = Convert.ToInt64(lines[i]);

                    }

                    speicher.Personen.Add(p);


So klappt es eine Person der Gruppe hinzufügen.

Wie fügt man jetzt mit der Anweisung speicher.Personen.Add(p); bei jedem Durchgang der for Schleife Personen der PersonenGruppe hinzu, mit zusätzlichen While schleife? Aber welche Abbruchbedienung kann man da nehmen?

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Christian S. - Sa 03.07.10 00:16

Okay, ich habe keine Lust mehr.

Jetzt weist Du innerhalb der Schleife den Eigenschaften von s was zu, fügst dann außerhalb der Schleife p in die Personengruppe ein.

Denk einfach mal drüber nach, was Du da machst. Vorher schreib ich hier gar nichts mehr.


spitzname - Sa 03.07.10 00:20

user profile iconspitzname hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Du springst von Vorname zu ID zwei Zeilen weiter.

Du fügst der Personengruppe jetzt einmalig nach der Schleife was[1] hinzu. Sinnvoll?



[1]Irgendein "s", was sonst nirgendwo benutzt wird. Sinnvoll?


Nein es ist nicht Sinvoll, also nochmal die forschleife:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
for (int i = 0; i < lines.Length; i = i +4 )
                    {
                        p.Nachname = lines[i];
                        i = i + 1;
                        p.Vorname = lines[i];
                        i = i + 1;
                        p.Matrnummer = Convert.ToInt64(lines[i]);

                    }

                    speicher.Personen.Add(p);


So klappt es eine Person der Gruppe hinzufügen.

Wie fügt man jetzt mit der Anweisung speicher.Personen.Add(p); bei jedem Durchgang der for Schleife Personen der PersonenGruppe hinzu, mit zusätzlichen While schleife? Aber welche Abbruchbedienung kann man da nehmen?

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


spitzname - Sa 03.07.10 00:24

user profile iconspitzname hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconspitzname hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Du springst von Vorname zu ID zwei Zeilen weiter.

Du fügst der Personengruppe jetzt einmalig nach der Schleife was[1] hinzu. Sinnvoll?



[1]Irgendein "s", was sonst nirgendwo benutzt wird. Sinnvoll?


Nein es ist nicht Sinvoll, also nochmal die forschleife:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
for (int i = 0; i < lines.Length; i = i +4 )
                    {
                        p.Nachname = lines[i];
                        i = i + 1;
                        p.Vorname = lines[i];
                        i = i + 1;
                        p.Matrnummer = Convert.ToInt64(lines[i]);
                        speicher.Personen.Add(p);

                    }


So klappt es eine Person der Gruppe hinzufügen.

Wie fügt man jetzt mit der Anweisung speicher.Personen.Add(p); bei jedem Durchgang der for Schleife Personen der PersonenGruppe hinzu, mit zusätzlichen While schleife? Aber welche Abbruchbedienung kann man da nehmen?

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Mitmischer 1703 - Sa 03.07.10 07:07

Hm?


danielf - Sa 03.07.10 09:10

Hallo,

also das ist echt nicht nett und ich kann Christian verstehen wenn er keine Lust mehr hat.

Du sollst nicht versuchen und versuchen bis du zum Ziel kommst, sondern überlegen was du machen willst und dieses dann sukzessive in Code umsetzen.

Deine Überlegungen sollten also zuerst so aussehen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
// 1. Lese Datei zeilenweise ein

// 2. Erzeuge eine leere Sammlung von Personen

// 3. Solange es vier Zeilen gibt

// 3a. Fasse vier Zeilen zu einer Person zusammen

// 3b. Füge diese Person der Liste hinzu


So sollte dein Programmablauf aussehen und diesen bekommst du nicht durch versuchen! sondern durch überlegen. Also zuerst immer überlegen und dann "versuchen" diese Anweisungen umzusetzen.

Gruß


spitzname - Sa 03.07.10 16:01

user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

also das ist echt nicht nett und ich kann Christian verstehen wenn er keine Lust mehr hat.

Du sollst nicht versuchen und versuchen bis du zum Ziel kommst, sondern überlegen was du machen willst und dieses dann sukzessive in Code umsetzen.

Deine Überlegungen sollten also zuerst so aussehen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
// 1. Lese Datei zeilenweise ein

// 2. Erzeuge eine leere Sammlung von Personen

// 3. Solange es vier Zeilen gibt

// 3a. Fasse vier Zeilen zu einer Person zusammen

// 3b. Füge diese Person der Liste hinzu


So sollte dein Programmablauf aussehen und diesen bekommst du nicht durch versuchen! sondern durch überlegen. Also zuerst immer überlegen und dann "versuchen" diese Anweisungen umzusetzen.

Gruß



Danke euch für die Mühe, es hat endlich geklappt.

Erst nachdenken und dann Versuchen ist ein guter Tipp! :idea:

Jetzt ist Fussball angesagt, wir werden gewinnen!!!!

gruß