Laden...

InvalidCastException - Probleme mit foreach

Erstellt von sailer1986 vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.309 Views
S
sailer1986 Themenstarter:in
37 Beiträge seit 2008
vor 16 Jahren
InvalidCastException - Probleme mit foreach

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

915 Beiträge seit 2006
vor 16 Jahren

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(

X
2.051 Beiträge seit 2004
vor 16 Jahren

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".

S
sailer1986 Themenstarter:in
37 Beiträge seit 2008
vor 16 Jahren

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.

S
sailer1986 Themenstarter:in
37 Beiträge seit 2008
vor 16 Jahren

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

49.485 Beiträge seit 2005
vor 16 Jahren

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