Laden...

speichern von Datagridview ins XML

Erstellt von mimed vor 10 Jahren Letzter Beitrag vor 10 Jahren 3.467 Views
Thema geschlossen
M
mimed Themenstarter:in
8 Beiträge seit 2013
vor 10 Jahren
speichern von Datagridview ins XML

verwendetes Datenbanksystem: <XML>

Hallo Zusammen,

Ich habe folgendes Problem, ich möchte ein Englishtool schreiben, welches Aufgabenblätter und ein Lösungsblatt erstellt. Zurzeit habe ich als Notlösung meine Daten so in ein XML gespeichert und in ein Datagriedview angezeigt:

 public Boolean SafeItems(List<EnglishItem> pItemList)
        {
            try
            {
                int counter = 1;
                //XDOC erstellen
               
                
                while (counter <= 10)
                {
                    XDocument document = new XDocument(

                      new XDeclaration("1.0", "utf-8", "yes"),

                      new XComment("Mirza's xml"),

                      new XElement("EnglishList",
                        new XElement("EnglishItem",
                          new XElement("item", new XAttribute("german", "wir sind"), new XAttribute("pastparciple", "we have been"),
                              new XAttribute("simplepast", "we were"), new XAttribute("infinitive", "we are"), new XAttribute("id", 0))),
                        new XElement("EnglishItem",
                          new XElement("item", new XAttribute("german", "ich bin"), new XAttribute("pastparciple", "I have been"),
                              new XAttribute("simplepast", "I was"), new XAttribute("infinitive", "I am"), new XAttribute("id", 1))),
                        new XElement("EnglishItem",
                          new XElement("item", new XAttribute("german", "sein"), new XAttribute("pastparciple", "been"), 
                              new XAttribute("simplepast", "was"), new XAttribute("infinitive", "be"), new XAttribute("id", 2)))));
          

             document.Save("EnglishItems.xml");
                               
                   counter += 1;

                }



            
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        } 


        public List<EnglishItem> GetXmlContent()
        {
            List<EnglishItem> EList = new List<EnglishItem>();
            var vDoc = XDocument.Load(FilePath);

            foreach (XElement x in vDoc.Descendants("EnglishItem"))
            {

                int i = 1;
                foreach (XElement childElement in x.Descendants())
                {
                    EList.Add(new EnglishItem(int.Parse(childElement.Attribute("id").Value), childElement.Attribute("infinitive").Value, childElement.Attribute("german").Value, childElement.Attribute("pastparciple").Value, childElement.Attribute("simplepast").Value)); 
                    Console.WriteLine(i);
                    i++;
                }
                Debug.WriteLine(x.ToString());
            }

            return EList;
        }
    }
}

Jetzt möchte ich es umgekehrt auch speichern können. Wenn ich jetzt die weiteren Datenzeilen in Datagriedview eingebe, sollten sie im XML wieder abgespeichert werden. Wie muss ich den obigen Code ändern, damit es dann funktioniert? Brauche keine fertigen Lösungen sondern nur tipps 😃

Danke und freundliche Grüsse,

mimed

B
357 Beiträge seit 2010
vor 10 Jahren

Eine Klasse erstellen für die Vokabeln, diese durch Serialisieren und Deserialisieren speichern/lesen. Die Liste an das DataGridView binden oder ggf. Events davon abonnieren und entsprechend darauf reagieren.

M
mimed Themenstarter:in
8 Beiträge seit 2013
vor 10 Jahren

Was meinst du mit einer Klasse für die Vokabeln? Meinst du vielleicht sowas?

 namespace Core
{
    public class EnglishItem
    {
        public EnglishItem(int pmId, string pmInfinitive, string pmGerman, string pmPastparticiple, string pmSimplepast)
        {
            this.mId = pmId;
            this.mInfinitive = pmInfinitive;
            this.mGerman = pmGerman;
            this.mPastparticiple = pmPastparticiple;
            this.mSimplepast = pmSimplepast;
        }

        public EnglishItem()
        {            
        }

        public int _Id
        {
            get
            {
                return mId;
            }
            set
            {
                mId = value;
            }
        }

        public string _infinitive
        {
            get
            {
                return mInfinitive;
            }
            set
            {
                mInfinitive = value;
            }
        }

        public string _Simplepast
        {
            get
            {
                return mSimplepast;
            }
            set
            {
                mSimplepast = value;
            }
        }

        public string _Pastparticiple
        {
            get
            {
                return mPastparticiple;
            }
            set
            {
                mPastparticiple = value;
            }
        }

        public string _German
        {
            get
            {
                return mGerman;
            }
            set
            {
                mGerman = value;
            }
        }


        public int mId { get; set; }
        public string mInfinitive { get; set; }
        public string mGerman { get; set; }
        public string mPastparticiple { get; set; }
        public string mSimplepast { get; set; }
    } 
4.942 Beiträge seit 2008
vor 10 Jahren

Hallo und willkommen,

erkunde dich mal nach der Klasse XmlSerializer.
Einen kurzen Einblick gibt es z.B. unter Mit XmlSerializer Objekte als XML speichern und laden

Deine Vokabel-Klasse ist schon mal ein guter Ansatz. So trennst du dann code-technisch Logik und Persistierung der Daten.

M
mimed Themenstarter:in
8 Beiträge seit 2013
vor 10 Jahren
  static void Main(String[] args)
         {
             EnglishItem englishitem = new EnglishItem();
             englishitem.mGerman = "sein";
             englishitem.mId = 1;
             englishitem.mInfinitive = "test";
             englishitem.mPastparticiple = "testtest";
             englishitem.mSimplepast = "testtesttest";

             EnglishItem englishitem2 = new EnglishItem();
             englishitem2.mGerman = "sein2";
             englishitem2.mId = 2;
             englishitem2.mInfinitive = "test2";
             englishitem2.mPastparticiple = "testtest2";
             englishitem2.mSimplepast = "testtesttest2";

             List<EnglishItem> englishitems = new List<EnglishItem> { englishitem, englishitem2 };

             SerializeToXML(englishitems);
         }





        static public void SerializeToXML(List<EnglishItem> englishitems)
         {
             XmlSerializer serzializer = new XmlSerializer(typeof(EnglishItem));
             TextWriter textwriter = new StreamWriter(@"C:\Englishitem.xml");
             serzializer.Serialize(textwriter, englishitems);
             textwriter.Close();
         }


Ich habe folgenden Code geschrieben. Bin ich auf der richtigen Richtung?

4.942 Beiträge seit 2008
vor 10 Jahren

Ja, fast. Einzig dem XmlSerializer mußt du noch den richtigen Typ mitgeben, d.h.


XmlSerializer serializer = new XmlSerializer(typeof(List<EnglishItem>)); // List anstatt nur Item

(ich habe auch den Schreibfehler beim Variablennamen korrigiert 😉

Alles weitere solltest du dann durch Testen hinkriegen...

M
mimed Themenstarter:in
8 Beiträge seit 2013
vor 10 Jahren

Jetzt sollte es eigentlich in meinem Datagridview anzeigen, die ich erstellt habe. Wo könnte ich noch einen Fehler haben?

namespace DL
{


    public class DL
    {
                
         const String FilePath = "EnglishItems.xml";

        /// <summary>
        /// Was mach ich hier ?
        /// </summary>
        /// <param name="pItemList">Liste aus EnglischenItems</param>
        /// <returns>Hat es funktioniert?</returns>
        /// 

         

         static void Main(String[] args)
         {
             EnglishItem englishitem = new EnglishItem();
             englishitem.mGerman = "sein";
             englishitem.mId = 1;
             englishitem.mInfinitive = "test";
             englishitem.mPastparticiple = "testtest";
             englishitem.mSimplepast = "testtesttest";

             EnglishItem englishitem2 = new EnglishItem();
             englishitem2.mGerman = "sein2";
             englishitem2.mId = 2;
             englishitem2.mInfinitive = "test2";
             englishitem2.mPastparticiple = "testtest2";
             englishitem2.mSimplepast = "testtesttest2";

             List<EnglishItem> englishitems = new List<EnglishItem> { englishitem, englishitem2 };

             SerializeToXML(englishitems);
         }





        static public void SerializeToXML(List<EnglishItem> englishitems)
         {
             XmlSerializer serializer = new XmlSerializer(typeof(List<EnglishItem>)); // List anstatt nur Item
             TextWriter textwriter = new StreamWriter(@"C:\Users\mimed\Documents\Visual Studio 2013\Projects\FL\FL\bin\Debug\EnglishItems.xml");
             serializer.Serialize(textwriter, englishitems);
             textwriter.Close();
         }



 public Boolean SafeItems(List<EnglishItem> pItemList)
        {
            try
            {
                int counter = 1;
                //XDOC erstellen
               
                
               while (counter <= 10)
                {
                    XDocument document = new XDocument(
                        new XDeclaration("1.0", "utf-8", "yes"),
                      new XComment("Mirza's xml"),
                      new XElement("EnglishList",
                        new XElement("EnglishItem",
                          new XElement("item", new XAttribute("german", "wir sind"), new XAttribute("pastparciple", "we have been"),
                              new XAttribute("simplepast", "we were"), new XAttribute("infinitive", "we are"), new XAttribute("id", 0))),
                        new XElement("EnglishItem",
                          new XElement("item", new XAttribute("german", "ich bin"), new XAttribute("pastparciple", "I have been"),
                              new XAttribute("simplepast", "I was"), new XAttribute("infinitive", "I am"), new XAttribute("id", 1))),
                        new XElement("EnglishItem",
                          new XElement("item", new XAttribute("german", "sein"), new XAttribute("pastparciple", "been"), 
                              new XAttribute("simplepast", "was"), new XAttribute("infinitive", "be"), new XAttribute("id", 2)))));
          

             document.Save("EnglishItems.xml");
                               
                   counter += 1; 

                }



            
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
        

        public List<EnglishItem> GetXmlContent()
        {


            List<EnglishItem> EList = new List<EnglishItem>();
            var vDoc = XDocument.Load(FilePath);

            foreach (XElement x in vDoc.Descendants("EnglishItem"))
            {

                int i = 1;
                foreach (XElement childElement in x.Descendants())
                {
                    EList.Add(new EnglishItem(int.Parse(childElement.Attribute("id").Value), childElement.Attribute("infinitive").Value, childElement.Attribute("german").Value, childElement.Attribute("pastparciple").Value, childElement.Attribute("simplepast").Value)); //Console.WriteLine(childElement);
                    Console.WriteLine(i);
                    i++;
                }
                Debug.WriteLine(x.ToString());
            }

            return EList;
        }
    }
} 

Ich habe noch die andere Variante drin gelassen. Was muss ich hier noch anpassen ich komme einfach nicht drauf? Danke und Gruss

2.298 Beiträge seit 2010
vor 10 Jahren

Ich behaupte dir fehlt eine "DeserializeFromXML"-Methode.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

M
mimed Themenstarter:in
8 Beiträge seit 2013
vor 10 Jahren
namespace DL
{


    public class DL
    {
                
         const String FilePath = "EnglishItems.xml";

        /// <summary>
        /// Was mach ich hier ?
        /// </summary>
        /// <param name="pItemList">Liste aus EnglischenItems</param>
        /// <returns>Hat es funktioniert?</returns>
        /// 

         

         static void Main(String[] args)
         {
             EnglishItem englishitem = new EnglishItem();
             englishitem.mGerman = "sein";
             englishitem.mId = 1;
             englishitem.mInfinitive = "test";
             englishitem.mPastparticiple = "testtest";
             englishitem.mSimplepast = "testtesttest";

             EnglishItem englishitem2 = new EnglishItem();
             englishitem2.mGerman = "sein2";
             englishitem2.mId = 2;
             englishitem2.mInfinitive = "test2";
             englishitem2.mPastparticiple = "testtest2";
             englishitem2.mSimplepast = "testtesttest2";

             List<EnglishItem> englishitems = new List<EnglishItem> { englishitem, englishitem2 };

             SerializeToXML(englishitems);
         }





        static public void SerializeToXML(List<EnglishItem> englishitems)
         {
             XmlSerializer serializer = new XmlSerializer(typeof(EnglishItem));
             TextWriter textwriter = new StreamWriter(@"C:\Englishitem.xml");
             serializer.Serialize(textwriter, englishitems);
             textwriter.Close();
         }




        private static void BasicDeSerializationMethod()
        {
            // Create an instance of BasicSerialization class.
            EnglishItem  serializeObject = new EnglishItem();
            // Create an instance of new TextReader.
            TextReader txtReader = new StreamReader(@"C:\Englishitem.xml");
            // Create and instance of XmlSerializer class.
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(EnglishItem));
            // Deserialize from the StreamReader.
            serializeObject = (EnglishItem)xmlSerializer.Deserialize(txtReader);
            // Close the stream reader
            txtReader.Close();
        }
        
        
        

























 public Boolean SafeItems(List<EnglishItem> pItemList)
        {
            try
            {
                int counter = 1;
                //XDOC erstellen
               
                
               while (counter <= 10)
                {
                    XDocument document = new XDocument(
                        new XDeclaration("1.0", "utf-8", "yes"),
                      new XComment("Mirza's xml"),
                      new XElement("EnglishList",
                        new XElement("EnglishItem",
                          new XElement("item", new XAttribute("german", "wir sind"), new XAttribute("pastparciple", "we have been"),
                              new XAttribute("simplepast", "we were"), new XAttribute("infinitive", "we are"), new XAttribute("id", 0))),
                        new XElement("EnglishItem",
                          new XElement("item", new XAttribute("german", "ich bin"), new XAttribute("pastparciple", "I have been"),
                              new XAttribute("simplepast", "I was"), new XAttribute("infinitive", "I am"), new XAttribute("id", 1))),
                        new XElement("EnglishItem",
                          new XElement("item", new XAttribute("german", "sein"), new XAttribute("pastparciple", "been"), 
                              new XAttribute("simplepast", "was"), new XAttribute("infinitive", "be"), new XAttribute("id", 2)))));
          

             document.Save("EnglishItems.xml");
                               
                   counter += 1; 

                }



            
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
        

        public List<EnglishItem> GetXmlContent()
        {


            List<EnglishItem> EList = new List<EnglishItem>();
            var vDoc = XDocument.Load(FilePath);

            foreach (XElement x in vDoc.Descendants("EnglishItem"))
            {

                int i = 1;
                foreach (XElement childElement in x.Descendants())
                {
                    EList.Add(new EnglishItem(int.Parse(childElement.Attribute("id").Value), childElement.Attribute("infinitive").Value, childElement.Attribute("german").Value, childElement.Attribute("pastparciple").Value, childElement.Attribute("simplepast").Value)); //Console.WriteLine(childElement);
                    Console.WriteLine(i);
                    i++;
                }
                Debug.WriteLine(x.ToString());
            }

            return EList;
        }
    }
} 
 

Es passiert einfach nichts. Ich komme einfach nicht ans Resultat, wisst ihr vielleicht wo ich den Fehler habe?

M
mimed Themenstarter:in
8 Beiträge seit 2013
vor 10 Jahren

Lies nochmal meinen letzten Beitrag.

Ich habe es angepasst aber funktioniert leider immer noch nicht richtig soll ich den anderen code rauslöschen?

4.942 Beiträge seit 2008
vor 10 Jahren

Verwendest du denn jetzt in der Serialize als auch der Deserialize-Methode beidesmal "List<EnglishItem>"?

P.S: Und ja, editiere mal deinen letzten Code, so daß nur noch die Main, SerializeToXML sowie BasicDeSerializationMethod (btw. diese solltest du besser DeserializeFromXML nennen) drinstehen.

M
mimed Themenstarter:in
8 Beiträge seit 2013
vor 10 Jahren

Verwendest du denn jetzt in der Serialize als auch der Deserialize-Methode beidesmal "List<EnglishItem>"?

P.S: Und ja, editiere mal deinen letzten Code, so daß nur noch die Main, SerializeToXML sowie BasicDeSerializationMethod (btw. diese solltest du besser DeserializeFromXML nennen) drinstehen.

jaa beidesmal steht List<EnglishItem>

ich Möchte das nun auf einen Button weitergeben vom über den Button zum Businesslayer zum Datalayer, nun geht da wieder was schief:


namespace BL
{
    public class _BL
    {
        public Boolean Save(List<EnglishItem> pEIlist)
        {
            DL.DL Datalayer = new DL.DL();
            return Datalayer.DeserializeFromXml(pEIlist);
        }

        /// <summary>
        /// Was wird hier gemacht 
        /// </summary>
        /// <returns>Was kommt zurück</returns>
       
        public List<EnglishItem> GetXmlContent()
        {
            DL.DL Datalayer = new DL.DL();
            return Datalayer.SerializeToXML();

          
        }
    }                                         
}

5.658 Beiträge seit 2006
vor 10 Jahren

Hi mimed,

SerializeToXml serialisiert Daten in ein XML-Dokument (wie der Name schon sagt). Es gibt also keine Businessdaten zurück, sondern erwartet sie als Parameter um sie zu serialisieren. Andersherum erstellt die DeserializeFromXml-Methode Businessobjekte aus einem Xml-Dokument. Du verwendest die beiden Methoden also genau verkehrtherum.

Christian

Edit: Übrigens sollten die Daten nicht einfach auf C:\ gespeichert werden, sondern im Anwendungsdaten-Verzeichnis (AppData).

Weeks of programming can save you hours of planning

M
mimed Themenstarter:in
8 Beiträge seit 2013
vor 10 Jahren

Hi mimed,

SerializeToXml serialisiert Daten in ein XML-Dokument (wie der Name schon sagt). Es gibt also keine Businessdaten zurück, sondern erwartet sie als Parameter um sie zu serialisieren. Andersherum erstellt die DeserializeFromXml-Methode Businessobjekte aus einem Xml-Dokument. Du verwendest die beiden Methoden also genau verkehrtherum.

Christian

Edit: Übrigens sollten die Daten nicht einfach auf C:\ gespeichert werden, sondern im Anwendungsdaten-Verzeichnis (AppData).

Danke für deine Antwort, könntest du mir vielleicht zeigen wie ich das nun erstellen sollte? ich hab jetzt den Durchblick verloren. Also bei mir siehts nun so aus:


 static void Main(String[] args)
         {
             EnglishItem englishitem = new EnglishItem();
             englishitem.mGerman = "sein";
             englishitem.mId = 1;
             englishitem.mInfinitive = "test";
             englishitem.mPastparticiple = "testtest";
             englishitem.mSimplepast = "testtesttest";

             EnglishItem englishitem2 = new EnglishItem();
             englishitem2.mGerman = "sein2";
             englishitem2.mId = 2;
             englishitem2.mInfinitive = "test2";
             englishitem2.mPastparticiple = "testtest2";
             englishitem2.mSimplepast = "testtesttest2";

             List<EnglishItem> englishitems = new List<EnglishItem> { englishitem, englishitem2 };

             SerializeToXML(englishitems);
         }





        static public void SerializeToXML(List<EnglishItem> englishitems)
         {
             XmlSerializer serializer = new XmlSerializer(typeof(List<EnglishItem>));
             TextWriter textwriter = new StreamWriter(FilePath);
             serializer.Serialize(textwriter, englishitems);
             textwriter.Close();
         }


        public EnglishItem DeserializeFromXml()
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List<EnglishItem>));
            TextReader txtstream = new StreamReader(FilePath);
            //Die Deserialize()-Methode gibt ein Object zurück. => casten!
            EnglishItem EIList = serializer.Deserialize(txtstream) as EnglishItem;
            txtstream.Close();
            return EIList;
        }

Der obige Code sollte nun stimmen.


public class _BL
    {
        public Boolean Save(List<EnglishItem> pEIlist)
        {
            DL.DL Datalayer = new DL.DL();
            return Datalayer.DeserializeFromXml(pEIlist);
        }

        /// <summary>
        /// Was wird hier gemacht 
        /// </summary>
        /// <returns>Was kommt zurück</returns>
       
        public List<EnglishItem> GetXmlContent()
        {
            DL.DL Datalayer = new DL.DL();
            return Datalayer.SerializeToXML();

          
        }
    }        

Wie sollte ich nun den Code hier umgekehrt aufbauen?

EDIT: Bin kein Profi im Programmieren, bis jetzt musste ich es mir mühsam erarbeiten :p

5.658 Beiträge seit 2006
vor 10 Jahren

ich hab jetzt den Durchblick verloren.

Dann hilft es dir aber auch nicht, wenn dir jemand den richtigen Code schreibt (mal ganz abgesehen davon, daß das Forum nicht dafür da ist, siehe [Hinweis] Wie poste ich richtig?).

Da du schon über solche grundlegenden Ansätze wie Serialisierung und Deserialisierung stolperst, würde es dir viel mehr helfen, erstmal alles wegzulegen und dich mit den Grundlagen auseinanderzusetzen. Schau dir Tutorials dazu im Internet an und auch zu der Trennung der unterschiedlichen Schichten. Dann kannst du dir deinen Code nochmal anschauen und merkst sicherlich selbst gleich, was da nicht stimmt.

So kommen wir jedenfalls in dem Beitrag auf keinen grünen Zweig, deshalb ist jetzt hier auch zu. Solltest du dann konkrete Fragen haben, kannst du einen neuen Thread dazu aufmachen.

Christian

Weeks of programming can save you hours of planning

Thema geschlossen