Objektinitialisierung scheitert
-
Ich habe eine Windowsform programmiert, welche in einer Listbox meine Kundennamen ausgeben soll. Da ich in einem Beispiel zuvor bereits damit gearbeitet habe, mir spezielle Kunden mit einer speziellen Postleitzahl rauszusuchen steht in dieser Form der markierte Teil:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Daten; namespace prg6 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Kundentabelle kdtab = new Kundentabelle("d:\\heinemann\\Kunden.txt"); kdtab.LoadFromFile(); List<Kunde> Kunden = kdtab.HoleMirKunden("12345"); //Hier wird ein Objekt initialisiert des Types Kunden, welches ganz //spezielle Anforderungen hat. Dieses wird ja per public Kunde //HoleMirEinenKunden(int Kontobla) in Kundentabelle rückgegeben über das Kd, //weil Kd im Kontext nicht vorhanden ist. Ich kann den dann ja aber auch nicht //neu inititialisieren, da er dann ja die Rückgabe überschreibt??*/ foreach (Kunde Kd in Kunden) { listBox1.Items.Add(Kd); } } } }
Das Objekt soll aber nun eben nicht spezielle raussuchen, sondern einfach alle
Namen ausgeben in der Listbox. Klingt super einfach, ich habe jedoch einfach
den Überblick verloren. Ich weiß nicht, wie ich die Kundennamen in die
Formklasse rüberhole, die aus folgendem Code kommen:using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace Daten { public class Kundentabelle { List<Kunde> liste = new List<Kunde>(); public string DateiName; public Kundentabelle(string UDatei) { DateiName = UDatei; } public void LoadFromFile() { StreamReader rd = new StreamReader(DateiName); string line; while ((line = rd.ReadLine()) != null) { string[] words = line.Split('|'); Kunde Kd = new Kunde(); Kd.Name = words[1]; Kd.Konto = int.Parse(words[0]); Kd.Strasse = words[2]; Kd.Postleitzahl = words[3]; Kd.Ort = words[4]; Kd.Kreditlimit = decimal.Parse(words[5]); Kd.KreditlimitChanged += new EventHandler(Kd_KreditlimitChanged); liste.Add(Kd); } rd.Close(); } public void Kd_KreditlimitChanged(object sender, EventArgs e) { Console.WriteLine("Kreditlimit hat sich geändert ({0})", ((Kunde)sender).Name); } public void AusgabeConsole() { Console.WriteLine(); Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Kundenliste:\n"); Console.ForegroundColor = ConsoleColor.Gray; Console.WriteLine(); Console.WriteLine(); foreach (Adresse adr in liste) { adr.AusgabeConsole(); } } public void SaveToFile() { StreamWriter wr = new StreamWriter(DateiName); foreach (Kunde Kd in liste) { wr.WriteLine("{0}|{1}|{2}|{3}|{4}|{5}", Kd.Konto , Kd.Name, Kd.Strasse, Kd.Postleitzahl, Kd.Ort, Kd.Kreditlimit); } wr.Close(); } public Kunde HoleMirEinenKunden(int Kontobla) { foreach (Kunde Kd in liste) { if (Kontobla == Kd.Konto) { return Kd; } } return null; } public List<Kunde> HoleMirKunden(string Postleitzahlen) { List<Kunde> Kundenliste = new List<Kunde>(); foreach (Kunde Kd in liste) { if (Postleitzahlen == Kd.Postleitzahl) { Kundenliste.Add(Kd); } } return Kundenliste; } } }
Ich habe schon probiert die Initialisierung zu entfehrnen und weiß aber nicht, wie ich den geforderten Typen initilaisiere.
Die Namen werden im Übrigen so ausgegeben:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Daten { public class Kunde : Adresse { public int Konto; public string Name; public event System.EventHandler KreditlimitChanged; private decimal _Kreditlimit; public decimal Kreditlimit { get { return _Kreditlimit; } set { _Kreditlimit = value; if (KreditlimitChanged != null) KreditlimitChanged(this, new EventArgs()); } } public override void AusgabeConsole() { Console.WriteLine("----------------------------"); Console.WriteLine("Konto: {0}", Konto); Console.WriteLine("Name: {0}", Name); Console.WriteLine("Kreditlimit: {0}", Kreditlimit); base.AusgabeConsole(); } public override string ToString() { return Name; } } }
Alle im Code verwendeten Typen und Bezeichnungen wurden so vorgegeben, auch wenn die komisch ausehen, damit ich nicht aus bestehenden Codes
einfach so ableiten kann, ich soll es ja selber versuchen.
-
Ich würde ja direkt auf die Methoden und Properties des Kunden zugreifen, die ich verwenden will, z.B. per:
foreach (Kunde Kd in Kunden) { listBox1.Items.Add(Kd.Name); }
(btw, ich bin nicht sicher, ob int wirklich der richtige Datentyp für eine Kontonummer ist)
-
So habe ich es wie gesagt schon versucht. Allerdings gibt er dann ja nur den Namen aus, zu dem die Postleitzahl 12345 (über hole mir einen Kunden gehört). Wenn ich Hole mir einen Kunden also entfehrne, dann meckert er aber Kunden im vorgeschlagenem Schleifenkopf an, was ja mein Problem ist. Ich weiß also nicht, wie ich Kunden in die From Klasse bekomme?
-
Ich verstehe dein Problem nicht so ganz. Du willst alle Kunden?
Hier hast Du sie:public List<Kunde> HoleMirAlleKunden() { return liste; }
-
Also wenn ich in der Klasse Kundetabelle
public List<Kunde> HoleMirAlleKunden() { return liste; }
programmiere und diese in der Form über
List<Kunde> Kunden = kdtab.HoleMirAlleKunden();
aufrufe, meldet er einen Fehler, dass Daten.Kundetabelle keine Definiton beinhaltet für HoleMirAlleKunden.
-
Liegt Daten.Kundetabelle in einer DLL?
Dann bereinige mal das Projekt und übersetze alles neu. Achte auf die korrekte Buildreihenfolge. Lösche die alte DLL notfalls von Hand.
-
Der Fehler lag darin, dass ich die Projektmappe kopiert habe und danach umbenannt habe