Entwickler-Ecke
C# - Die Sprache - Personendaten Verwaltung
spitzname - So 27.06.10 14:00
Titel: Personendaten Verwaltung
Hallo, ich möchte zwei Klassen schreiben die daten von Personen verwalten und würde mich über Tipps freuen.
Die Erste klasse heisst 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: 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; } } } |
Die Daten einer Person werden in einer Instanz der Klasse person gespeichert.
Für den Zugriff auf die Elementvariablen werden die entsprechenden Accessoren verwendet.
Nun möchte ich Zur Verwaltung von mehreren Personen eine Klasse PersonenGruppe schreiben.
Diese soll eine ArrayList-Instanz mit Elementen vom Typ Person beinhalten.
ab hier komme ich nicht voran und würde mich über jede Hilfe freuen.
C#-Quelltext
1: 2: 3: 4: 5: 6:
| class PersonenGruppe { List<Person> personListe = new List<Person>();
} |
gruß spitzname
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
Christian S. - So 27.06.10 14:03
Du müsstest dann aber schon noch schreiben, warum Du nicht weiter kommst :-)
spitzname - So 27.06.10 14:11
Christian S. hat folgendes geschrieben : |
Du müsstest dann aber schon noch schreiben, warum Du nicht weiter kommst :-) |
Ok, ich habe leider noch keinen richtigen Ansatz. Sollte ich auch hier mit einem Konstruktor und Accesoren arbeiten also so:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| private Person person
public PersonenGruppe(Peron p) { Person = p; }
public Person pers { get { return personen; } set { this.personen = value; } } |
aber wie soll ich die ArrayList-Instanz hier miteinbinden?
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
Toeffi - So 27.06.10 14:38
Genauso wie du es auch mit anderen Properties machst.
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>(); }
} |
Schon kannst du Personen in deiner Personengruppe verwalten, indem du sie über
C#-Quelltext
1: 2:
| PersonGruppe gruppe = new PersonGruppe(); gruppe.Personen.Add(new Person(...)); |
hinzufügst.
jaenicke - So 27.06.10 14:46
Oder suchst du vielleicht einen Index für die Klasse (da fehlt natürlich noch die Behandlung eines falschen Index)?
C#-Quelltext
1: 2: 3: 4: 5:
| public Person this[int index] { get { return personListe[index]; } set { personListe[index] = value; } } |
Dann kannst du direkt einen Index hinter die Klasse setzen.
C#-Quelltext
1: 2:
| PersonenGruppe Hallo = new ... Hallo[0]... |
spitzname - So 27.06.10 20:25
Danke, für die Antworten die haben mir weitergeholfen!
Ich habe noch folgende Frage zu dem obigen Thema:
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:
| public partial class FrmPersonVerwaltung : Form {
public FrmPersonVerwaltung() { InitializeComponent(); }
private void btnAdd_Click(object sender, EventArgs e) { FrmDaten daten = new FrmDaten();
DialogResult dlgAntwort; Person p = new Person(); PersonGruppe gruppe = new PersonGruppe();
dlgAntwort = daten.ShowDialog();
if (dlgAntwort == DialogResult.OK) { p.Nachname = daten.txtNachname.Text; p.Vorname = daten.txtVorname.Text; p.ID = Convert.ToInt64(daten.ID.Text);
gruppe.Person.Add(new Person(p.Nachname, p.Vorname, p.ID)); txtEingabe.AppendText(gruppe.Person[0] + Environment.NewLine); daten.Close(); } } } |
Mit dem Code füge ich mit einem Click auf OK einem Formular in eine TextBox, die in diesem Fall txtEingabe heisst, Personen daten(p.Nachname, p.Vorname, p.ID) hinzu.
Nun zu meiner Frage: Wie kann man einen bestimmten Datensatz einer Person jetzt löschen?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| private void btnClear_Click(object sender, EventArgs e) {
FrmDaten daten = new FrmDaten(); DialogResult dlgAntwort; Person p = new Person(); PersonGruppe gruppe = new PersonGruppe(); dlgAntwort = daten.ShowDialog();
if (dlgAntwort == DialogResult.OK) { ................? } } |
würde mich über Tipps freuen
gruß spitzname
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
Toeffi - So 27.06.10 20:32
Naja erstmal was anderes.
Das hier:
C#-Quelltext
1:
| gruppe.Person.Add(new Person(p.Nachname, p.Vorname, p.ID)); |
brauchst du nicht machen, denn du hast doch vorher schon ein Person objekt erstellt, welchem du die ganzen sachen zugewiesen hast.
Da reicht es wenn du
machst.
Zum löschen Thema könntest du mit Extension Methods arbeiten und wie folgt löschen.
C#-Quelltext
1: 2: 3:
| Person p = gruppe.Person.Where(person => person.ID == 100).SingleOrDefault(); if(p != null) gruppe.Person.Remove(p); |
Die 100 als ID ist jetzt ersponnen die musst du natürlich aus deinem Forumlar irgendwie ziehen.Da wo du das eben speicherst oder so.
danielf - So 27.06.10 21:54
Hallo,
also das was Toeffi so schreibt finde ich sehr umständlich. Schau dir den Ansatz von Sebastian (jaenicke) an... Mit einer Collection und direkten Zugriff per Index macht das mehr Sinn.
Allerdings macht der Accessor/Index über die pure Liste meines erachtens weniger Sinn, sondern an der Stelle sollte man die Id verwenden.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| public Person this[int index] { get { return personListe.Where(person => person.Id == index).First(); } set { try { this.Remove(this[index]); this.Add(value); catch { } } |
In deiner Form Klasse brauchst du dann eine Klassenmember vom Typ PersonenGruppe... Ansonsten sind die hinzugefügten Personen wieder weg(wenn du eine neue Instanz anlegst).
Löschen würde dann so aussehn (wenn du die ID hast):
C#-Quelltext
1:
| personenGruppe.Remove(personenGruppe[100]); |
bzw. wenn du gleich das Objekt hast (was wahrscheinlicher ist):
C#-Quelltext
1:
| personenGruppe.Remove(person); |
Das sieht doch logischer aus ? ;)
Gruß
Kha - So 27.06.10 22:09
Indexer, Lambdas, leere Catch-Blöcke (:shock:)... ich weiß nicht, ob das hier so wirklich angemessen ist. Wie wäre es mit folgendem Code für den Anfang?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| class PersonenGruppe { ...
public Person FindPersonByID(int id) { foreach (Person p in ...) if (p...) ... }
public void RemovePersonByID(int id) { Personen.Remove(FindPersonByID(id)); } } |
Bitte entsprechend ergänzen ;) .
Und nichtsdestotrotz hat Daniel mit
danielf hat folgendes geschrieben : |
In deiner Form Klasse brauchst du dann eine Klassenmember vom Typ PersonenGruppe... Ansonsten sind die hinzugefügten Personen wieder weg(wenn du eine neue Instanz anlegst). |
natürlich vollkommen recht :) .
danielf - So 27.06.10 22:15
Ich denke Indexer sind schon angebracht genau so wie Linq Ausdrücke.
Aus dem leeren Catch Block kann man natürlich auch davor abfragen, ob die gewünschte Id schon besteht... Performanter wäre aber der try catch :o Ach seh grad.. das Add natürlich dahinter... Fußball war lang heute Mittag :D :D
Aber darüber soll er glaub selbst entscheiden :D
Angenehmer fürs erste ist sicherlich eine foreach-Schleife ... dennoch würde ich den Index als "Pflicht" sehen.. ansonsten ist der Code "verwirrend".
Gruß
Kha - So 27.06.10 22:36
danielf hat folgendes geschrieben : |
Ich denke Indexer sind schon angebracht genau so wie Linq Ausdrücke. |
Ich will jemanden, der noch mit der OOP kämpft, einfach ungern direkt mit dem nächsten Paradigma erschlagen :nixweiss: .
danielf hat folgendes geschrieben : |
Aus dem leeren Catch Block kann man natürlich auch davor abfragen, ob die gewünschte Id schon besteht... Performanter wäre aber der try catch :o |
Das bezweifle ich doch stark (auf der unmethodischen Performance-Skala dürfte hinter Exceptions höchstens noch Reflection stehen), aber sollte hier ja nichts zur Sache tun. Bitte, bitte dann aber wenigstens immer den Exception-Typ angeben - weswegen wir wohl im Getter eine
ArgumentOutOfRangeException werfen sollten und äh... geben wir vielleicht doch lieber einfach
null zurück ;) ?
danielf hat folgendes geschrieben : |
Fußball war lang heute Mittag :D :D |
Na zum Glück nicht noch länger, das war schon schweißtreibend genug :mrgreen: .
Toeffi - Mo 28.06.10 07:24
Ok da habt ihr natürlich recht, da habe ich wohl mit Kanonen auf Spatzen geschossen und ganz vergessen das er gerade mit OOP anfängt. Die Idee mit dem Indexer ist wirklich gut. Gut dann kann sich der Threadersteller die Lösung ja mal anschauen wenn er weiter ist :) Danke für die Ergänzungen.
danielf - Mo 28.06.10 09:07
Also ich bin im getter-Teil dafür, dass eine Exception geschmissen wird. Sonst muss man ja später in jedem Code Abschnitt überprüfen ob die Person wirklich existiert. Ich gehe ja davon aus, dass wenn ich eine ID habe diese Person tatsälich exitisert.
Den Set-Teil würde ich ganz weg lassen, dafür gibt es ja Add.
Ach da fällt mir auf, dass ich von einer anderen Definitino der PersonenGruppe-Klasse ausgegangen bin (und keiner hat gemeckert ;) ).
Ich würde die PersonenGruppe von einer generischen Liste der Klasse Person erben lassen, um auf sämtliche Methoden der Collection direkt zugreifen zu können (vgl. mein Code). Dann sind später auch andere Abfragemöglichkeiten drin ohne jedes mal eine eigne Methode anzulegen.
Also nochmal zusammenfassend:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| publc class PersonenGruppe : List<Person>
public Person this[int] { get { return personListe.Where(person => person.Id == index).First(); } } } |
Die Verwendung der Klasse würde dann so aussehen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| PersonenGruppe gruppe = new PersonenGruppe(); gruppe.Add(new Person { Name = "Mustermann", Vorname = "Max" }); gruppe.Add(new Person { Name = "Mustermann", Vorname = "Moritz" }); Person eva = new Person { Name = "Musterfrau", Vorname = "Eva" }; gruppe.Add(eva);
int id = 5; gruppe.Remove(gruppe[id]);
gruppe.Remove(eva); |
Hoffe das veranschaulicht nochamls was ich gemeint hab.
Gruß
spitzname - Mo 28.06.10 14:08
Danke euch für die vielen Vorschläge! :D
ich habe es erstmal mit dem Vorschlag von Kha und Toeffi versucht, es klappt aber noch nicht ganz wo liegt mein Fehler?
also die Klsasse PersonenGruppe:
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:
| class PersonenGruppe {
public List<Person> Personen{get;private set;}
public PersonenGruppe() { this.Personen = new List<Person>(); }
public Person FindPersonByID(long id) { foreach (Person p in Personen) { if (p.ID.Equals(id)) return st; } }
public void RemovePersonByID(long id) { Personen.Remove(FindPersonByID(id)); }
} |
Und damit die hinzugefügten Personen nicht wieder verschwinden wenn eine neue Instanz angelegt wird sollte ich einen Klassenmebmer von Typ PersonenGruppe in der Form Klasse anlegen, ist das so richtig(siehe code rot markiert) ?
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:
| public partial class FrmPersonVerwaltung : Form { private PersonenGruppe speicher;
public FrmPersonVerwaltung() { InitializeComponent(); }
private void btnAdd_Click(object sender, EventArgs e) { FrmDaten daten = new FrmDaten();
DialogResult dlgAntwort; Person p = new Person(); PersonGruppe gruppe = new PersonGruppe();
dlgAntwort = daten.ShowDialog();
if (dlgAntwort == DialogResult.OK) { p.Nachname = daten.txtNachname.Text; p.Vorname = daten.txtVorname.Text; p.ID = Convert.ToInt64(daten.ID.Text);
gruppe.Person.Add(new Person(p.Nachname, p.Vorname, p.ID)); speicher = gruppe; txtEingabe.AppendText(gruppe.Person[0] + Environment.NewLine); daten.Close(); } } } |
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
danielf - Mo 28.06.10 14:21
zu 2) das ist so korrekt. Nun musst du aber noch auf den speicher zugreifen, anstatt wieder (zeile 19.) eine neue Gruppe zu erstellen. Das kannst du austauschen indem du die Zeile löscht und sie anstat speicher gruppe benennst. Die Instanziierung kannst du gleich in Zeile 4 machen (private PersonenGruppe speicher = new Personengruppe(););
zu 1) wenn du die Fehlermeldung mitliefster wäre es für uns einfacher ;) Aber ich denke der Fehler liegt daran, dass du in der Methode FindPersonByID unter umständen (wenn nicht existiert) keine Person zurück gibst. Du kannst nun entweder return null; in Zeile 19 zurückgeben oder in Zeile 19. eine ArgumentException werfen (Siehe Diskussion kha und mir).
Gruß
spitzname - Mo 28.06.10 15:44
danielf hat folgendes geschrieben : |
zu 2) das ist so korrekt. Nun musst du aber noch auf den speicher zugreifen, anstatt wieder (zeile 19.) eine neue Gruppe zu erstellen. Das kannst du austauschen indem du die Zeile löscht und sie anstat speicher gruppe benennst. Die Instanziierung kannst du gleich in Zeile 4 machen (private PersonenGruppe speicher = new Personengruppe(););
zu 1) wenn du die Fehlermeldung mitliefster wäre es für uns einfacher ;) Aber ich denke der Fehler liegt daran, dass du in der Methode FindPersonByID unter umständen (wenn nicht existiert) keine Person zurück gibst. Du kannst nun entweder return null; in Zeile 19 zurückgeben oder in Zeile 19. eine ArgumentException werfen (Siehe Diskussion kha und mir).
Gruß |
Vielen dank nochmal, hat alles geklappt! :D :D :D
An danielf, die oben genannten Fehler wurden von dir richtig benannt, nach der Korrektur funktioniert das Programm. :zustimm:
gruß
spitzname - Fr 02.07.10 13:08
Hallo nochmal,
ich habe zu diesem Thema noch eine folgende Frage:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| private void btnLoad_Click(object sender, EventArgs e) { DialogResult dlgAntwort; dlgAntwort = dlgLoad.ShowDialog();
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); } } |
mit diser Funktion kann man eine Textdatei in die Textbox("txtEingabe") aufnehmen. Die Textbox("txtEingabe") und die Textdatei hat fogenden Aufbau:
-->Beispiel:
Zeile-------- Dateiinhalt------------logische Bedeutung
1-------------Petersen---------------Nachname
2-------------Peter------------------Vorname
3-------------1234-------------------ID
4------------------------------------Leerzeile
5-------------Martinsen--------------Nachname
6-------------Martin-----------------Vorname
7-------------4321-------------------ID
8------------------------------------Leerzeile
wie kann man aus dieser Textdatei die z.B. diese obengenannten Daten enthält jede einzelne Person in die PersonenGruppe (ArrayList) aufnehmen.
würde mich über Tipps freuen
gruß
danielf - Fr 02.07.10 13:33
Das Thema hat nichts mehr mit dem Urspürnglichen Problem zu tun, wobei der Thread-Titel auch alles Möglich zu läßt. Mach also nächstes mal ein neues Thema auf für eine andere Frage und wähle den Titel passend zum Problem.
Du musst die Informationen aus der Datei herausparsen und dann ein neues Personen-Objekt erstellen. Für string-Verarbeitung gibt es sehr viele Methoden (siehe Klasse string). Dazu kommen Reguläre Ausdrücke. Was du genau nimmst ist abhängig davon, wie die Daten aufgebaut sind und wie du dich auskennst.
Du hast den Aufbau, zumindest für mich, nicht genau beschrieben. Sind das wirklich Striche oder repräsentieren diese Leerzeichen? Ist die Zeilennummber bzw. die logische Bedeutung immer dabei?
Am besten du gehst Zeilenweise durch die DAtei:
Mit der statischen methode ReadAllLines der Klasse File bekommst du den Inhalt einer Datei zeilenweise: File.ReadAllLines("file")
Je nach "Trennlogik" musst du dann die entsprechenden Zeilen zerlegen.
Gruß
spitzname - Fr 02.07.10 14:57
Danke für die Antwort, dann werde ich am besten ein neues Thema starten um weitere Fragen stellen zukönnen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!