[C#] Von Listview aus auf Objekt zugreifen

lars96

Mitglied
Hallo Leute,

ich habe folgendes Problem: Ich habe 2 Forms: eine zum Anlegen von "Personen" (wird ein Adressbuch) und eine für das Auswählen der jeweiligen Personen, welche gedruckt werden sollen.

Zum Anlegen der Personen habe ich eine xml Datei gemacht, in der alle Informationen sind, und welche auch ausgelesen & beschrieben werden.

Nun stehe ich jedoch vor einem Problem: in der 2. Form habe ich 2 ListBoxen, eine für alle verfügbaren Personen / Kontakte und eine für die, die ausgewählt werden zum Drucken. Dabei gibt es zwei Knöpfe, mit Hilfe denen man Kontakte von links nach rechts & umgekehrt verschieben kann. Jedoch mache ich dies bis jetzt so:
Code:
object s = listBox2.SelectedItem;
if (s != null)
{
listBox1.Items.Add(s);
listBox2.Items.Remove(s);
}

Und fürs andere genau so nur mit den listBoxen vertauscht. Meine Frage ist nun, wie ich herausfinde, welche Kontakte sich rechts, also im Druckbereich befinden, also welche Kontakte gedruckt werden sollen. Außerdem brauche ich dafür die Variablen der Objekte, also die Telefonnr., etc., die ich in der Klasse person definiert habe, und die auch in der xml Datei stehen.

Ich hoffe ihr versteht, worauf ich hinaus will und könnt mir bei meinem Problem helfen ;).

Liebe Grüße,

lars96
 

Akeshihiro

Erfahrenes Mitglied
Ehrlich gesagt, nicht so ganz ... Über deineDruckListBox.Items bekommst du doch alle deine Objekte aus der Druck-Liste. Und an die Werte kommst du über die Properties deiner Objekte.
 

lars96

Mitglied
Ich kann ja leider eben nicht auf die Properties zugreifen, da mein Objekt in der Listbox geladen wird, wenn ich es aber auf die Listbox fürs drucken verschiebe mittels oben gezeigter Methode, wird das Objekt mit den "infos" ja gelöscht und durch eine Variable, die nur den Namen enthällt getauscht ...

Verstehst Du jetzt in etwa was ich meine ...? In der Form2_Load Methode lade ich alles aus dem xml File und weiße der ListBox1.Items je das name Attribut meines Objekts zu. Dann beim Buttonklick kommt das von oben und nun brauche ich die Infos wieder bzw. wie kann ich anstatt das Objekt wie oben zu löschen es beibehalten und nur verschieben?
 

Akeshihiro

Erfahrenes Mitglied
Wenn du mit Objekten arbeitest, dann arbeitest du mit deren Referenzen. Wenn du also das Objekt von einer Liste in eine andere verschiebst, dann ist das Objekt ja nicht weg, die Referenz wird nur von einer anderen Liste verwaltet.

Aber wenn du natürlich nur die Namen in die Liste einfügst, dann haste natürlich kein Verweis auf das eigentliche Objekt. Pack da nicht die Namen in die Liste, sondern das komplette Objekt. Dann wird das auch funktionieren.
 

lars96

Mitglied
Habe es nun so: p = listBox1.SelectedItem; probiert, kriege jedoch einen Error, weil man kein object in einen String oder so umwandeln kann...

Außerdem habe ich das Objekt p in Form2_load "geholt", habe es also nicht im button1_click event, muss es also wieder via Form1.person p = new Form1.person(); erstellen, und dann hat es ja wieder nicht die Eigenschaften des Objekts in der xml datei, oder soll ich das mit der xml datei nun in jeder Methode machen?
 

Akeshihiro

Erfahrenes Mitglied
Du bekommst aus den Listen die Objekte raus, die du auch rein getan hast. Du brauchst nicht mit object oder sonst was zu arbeiten. Beim Verschieben von einer ListBox in die andere reicht object als Typ aus, da man mit dem eigentlichen Objekt nicht wirklich arbeiten will, man verschiebt lediglich die Referenz und kann sich somit das Rumgecaste sparen.

Anders sieht es aus, wenn du mit den Objekten arbeiten willst und das willst du ja. Ich hab mal nen Beispielprojekt erstellt und es angehängt. Da kannst du dann abgucken. Ich habe da unter die zu druckende ListBox einen Button zum Drucken hinzugefügt. Dieser gibt einfach für jede selektierte Person eine MessageBox mit den Daten aus. In dem EventHandler dieses Buttons kannst du dann auch sehen, dass man ganz normal mit den Objekten aus der Liste arbeiten kann. Da war es dank der foreach-Schleife nicht nötig, dass ich da explizit caste, aber man kann die Objekte, die die ListBox liefert, ohne Probleme casten, sofern der Ziel-Datentyp auch wirklich dem Datentyp des Objektes entspricht, auf das man zugreifen will.

Sehr komisch ausgedrückt, weiß ich, aber vielleicht verstehst du es ja trotzdem ^^
 

Anhänge

  • WindowsFormsApplication1.rar
    63,9 KB · Aufrufe: 26
Zuletzt bearbeitet:

lars96

Mitglied
So ich danke Dir schonmal. Habe es nun ähnlich wie du gemacht, jedoch habe ich nun 2 Probleme:
In der Liste wird nun neben dem Zeug was in der xml Datei steht irgendwie bei jedem Benutzer darunter je ein "adressbuch.Form1+person" angezeigt ...

Wenn ich bei dem adressbuch.Form1+person Eintrag auf "Drucken" klicke, klappt alles super. Wenn ich jedoch bei einem richtigen Name auf Drucken klicke bekomme ich folgenden Error:

An unhandled exception of type 'System.InvalidCastException' occurred in adressbuch.exe

Additional information: Unable to cast object of type 'System.String' to type 'person'.

Was bedeutet das nun?

Lg
 

Akeshihiro

Erfahrenes Mitglied
Die komischen Einträge kommen wahrscheinlich daher, dass du in deiner Klasse person (übrigens beginnen Klassennamen eigentlich mit einem Großbuchstaben) die Methode ToString() nicht überlagert hast. Das habe ich in meinem Beispiel in der Klasse Person aber gemacht, daher sieht das bei mir anders aus. Du musst die Methode einfach nur überlagern und einen gewünschten String zurück geben, z.B. den Vor- und Nachnamen.

Die Fehlermeldungen:
Du hast in der Liste wahrscheinlich kein Objekte vom Typ person, sondern nur einen String. Den kannst du natürlich nicht einfach so zu einem person-Objekte casten. Daher der Fehler.
 

lars96

Mitglied
Ich danke dir von ganzem Herzen. Habe es erst nicht hingekriegt, da ich deine Klasse Person erst nicht in dem Ordner gefunden habe, ist aber in einer anderen Datei gewesen. (by the way: ich könnte das auch mal machen xD...)

Nun klappt alles ;).

lg

lars96