Hi,
ich habe auf einem großen Panel verschiedene Labels vom Typ auto und lkw liegen. Jetzt will ich die Daten die in den Objekten auto und klasse hinterlegt sind in xml speichern. Also habe ich gesagt:
public static void storeProject(string xmlFileName)
{
XmlTextWriter xmlTextWriter = null;
try
{
xmlTextWriter = new XmlTextWriter(xmlFileName, null);
}
catch (Exception ex)
{
//Meldung in Console
return;
}
// Formatierung und XML - Kopf erstellen
xmlTextWriter.Formatting = Formatting.Indented;
xmlTextWriter.Indentation = 1;
xmlTextWriter.IndentChar = '\t';
xmlTextWriter.WriteStartDocument();
xmlTextWriter.WriteStartElement("Sicherung");
xmlTextWriter.WriteComment("Projekts");
// Liste bereitstellen
xmlTextWriter.WriteStartElement("Fahrzeuge");
// alle einzelnen Fahrzeuge, die sich auf dem Plan befinden hinzufügen
foreach (Versuch.Formen.Auto auto in MainProgram.mainForm.splitContainer3.Panel1.Controls)
{
xmlTextWriter = auto.storeInXml(xmlTextWriter);
}
foreach (Versuch.Formen.Lkw lkw in MainProgram.mainForm.splitContainer3.Panel1.Controls)
{
xmlTextWriter = lkw.storeInXml(xmlTextWriter);
}
// Knoten, Dokument und XmlTextWriter schließen
xmlTextWriter.WriteEndElement();
xmlTextWriter.WriteEndElement();
xmlTextWriter.WriteEndDocument();
xmlTextWriter.Close();
}
Also er gibt mir jetzt immer eine InvalidCastException aus. Also meiner Meinung nach versucht er immer alle Objekte egal ob sie vom typ auto oder lkw sind in ein objekt, z.B. typ lkw wird versucht in typ auto, umzuwandeln. Kann mir jemand erklären warum. Meines erachtens müsste doch das erste foreach für alle Objekte mit dem typ auto durchlaufen werden und das zweite für den typ lkw.
Kann mir jemand sagen, was ich falsch mache oder wie ich es ändern kann?
LG
sailer
Und wie du richtig vermutest beinhaltet die Liste Controls sowohl deine Auto's und Lkw's labels. Wenn du diese mit einer Foreach Schleife durchläufst castest du diese nur auf die Kalsse Autos und das schmeißt dir bei einen Control vom Typ LKW natürlich eine Fehlermeldung.
Es gibt verschiedene Ansätze das ganze zu lösen: Gebe dir nur einen.
foreach(Control _ctr in MainProgram.mainForm.splitContainer3.Panel1.Controls)
{
Versuch.Formen.Auto auto = _ctr as Versuch.Formen.Auto;
Versuch.Formen.Lkw lkw = _ctr as Versuch.Formen.Lkw;
if(auto != null)
{
..... usw
}
if(lkw != null)
{
...usw
}
}
Aber sehr wahrscheinlich wird auch das dir abschmieren, da MainProgram.mainForm.splitContainer3.Panel1.Controls ein sehr komischer zugrifsweg auf deine Liste darstellt. Der statische member mainForm musss nicht zwangsläufig initalisiert und könnte daher auch null sein. Beachte dieses auch, entweder frägst nach null ab oder was besser wäre schau ob das wirklich sauber an der Stelle gelöst hast.
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
du verstehst die foreach funktionalität offensichtlich falsch. sie iteriert duch alle objekte einer liste. sie macht kleine filterrung nach dem moto "guck doch mal, ob da vielleicht sich ein int in der Liste versteckt hat".
Hi,
vielen vielen Dank für die schnelle Antwort. Es funktioniert. Aber du hattest recht
Aber sehr wahrscheinlich wird auch das dir abschmieren, da MainProgram.mainForm.splitContainer3.Panel1.Controls ein sehr komischer zugrifsweg auf deine Liste darstellt.
ist wirklich komisch. Habe es umgeändert und es funktioniert wunderbar.
VIELEN DANK
sailer
p.s. Kann geschlossen werden.
Hi,
sorry wir hatten unsere Antwort gleichzeitig abgeschickt. Ja dann habe ich es falsch verstanden ich dachte wenn ich hier
foreach (Lagerlogistik.Formen.Geraet geraet in MainProgram.mainForm.splitContainer3.Panel1.Controls)
meinen Typ angebe nimmt er nur die Objekte von diesem Typ. Ich wusste nicht, dass er durch alle durchgeht.
Danke
sailer
Hallo sailer1986,
Ich wusste nicht, dass er durch alle durchgeht.
deshalb heißt es ja foreach. 🙂 Aber ich verstehe schon, wie man darauf kommen kann "foreach (Typ ..." kann man auch als für jedes Objekt dieses Typs lesen. Ist aber nicht so. Wenn du das willst, gibt es aber einen entsprechenden Iterator in Hilfreiche Iteratoren / Improving Foreach .
Es kommt mir allerdings komisch vor, dass du überhaupt unterschiedliche Labeltypen für Auto und Lkw verwendest. Normalerweise sollte es reichen, unterschiedliche Modellklassen Auto und Lkw zu benutzen, aber nur einen Label-Klassen, nämlich class Label. GUI und Modell sollte man eher nicht mischen.
herbivore