115122
Goto Top

C-Sharp: XML Anfänger benötigt Hilfestellung

Hallo,

ich würde gerne Einträge, welche ich in einer Listbox mache abspeichern, damit ich sie beim nächsten Öffnen meiner kleinen Anwendung noch sehe.

Information vorweg:
Ich habe zwei Listboxen, eine heißt "todo", die andere Box heißt "erledigt".

Habe mich also über XML und dessen Verwendung informiert und bisher folgenden Code zusammengeschustert:

//XML functions
        //Export
        private void ExportXML()
        {
            try
            {
                List<string> todoList = new List<string>();
                List<string> erledigtList = new List<string>();
                XmlSerializer serializer = new XmlSerializer(typeof(List<string>));
                TextWriter tw = new StreamWriter(Application.StartupPath + "\\savefile.xml");  

                for (int i = 0; i <= lbTodo.Items.Count - 1; i++)
                {
                    todoList.Add(lbTodo.Items[i].ToString());
                }

                for (int n = 0; n <= lbErledigt.Items.Count - 1; n++)
                {
                    erledigtList.Add(lbErledigt.Items[n].ToString());
                }
                serializer.Serialize(tw, todoList);
                serializer.Serialize(tw, erledigtList);
                tw.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }

        //Import
        private void ImportXML()
        {
            try
            {
                XmlDocument xmldoc = new XmlDocument();
                xmldoc.Load(Application.StartupPath + "\\savefile.xml");  
                XmlElement root = xmldoc.DocumentElement;
                XmlNodeList lst = root.GetElementsByTagName("string");  

                foreach (XmlNode n in lst)
                {
                    lbTodo.Items.Add(n.InnerText);
                    lbErledigt.Items.Add(n.InnerText);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }

Dort, wo jeweils beim Eintragen etwas gespeichert werden soll, habe ich die Funktion aufgerufen, siehe Beispiel:

if (chkTodo.Checked == true)
{
     lbTodo.Items.Add(tbEintrag.Text);
     ExportXML();
}

Beim Start des Programms wird "ImportXML()" aufgerufen, damit die Daten geladen werden.


So weit so gut, wenn ich Datensätze in die ToDo-Liste eingebe, erscheinen diese in der Listbox und werden gleichzeitig in ein XML File geschrieben, das funktioniert einwandfrei.

Schiebe ich nun einen Datensatz in die "erledigt"-Liste oder trage NUR in diese Liste einen Eintrag ein, so werden die Listen nicht mehr separat behandelt und die Datensätze werden in beiden Listen dargestellt.

D.h. mein Problem ist, dass das XML File nicht zwischen den beiden Listen unterscheidet. Ich habe das ganze mit zwei List-Items und zwei for-Schleifen getestet, das hat aber nicht funktioniert. (siehe in oberem Codebeispiel -> ExportXML-Funktion)

Falls jemand für mein Problem eine Lösung oder einen Tipp parat hat, wäre ich dafür sehr dankbar. ;)

Grüße

Content-Key: 249646

Url: https://administrator.de/contentid/249646

Printed on: April 19, 2024 at 19:04 o'clock

Member: colinardo
Solution colinardo Sep 19, 2014, updated at Sep 24, 2014 at 08:31:54 (UTC)
Goto Top
Hallo lordzwieback,
dein Problem ist das du beim importieren nicht zwischen den zwei Listboxen unterscheidest (Zeile 41-45). Ich würde das wenn du es mit dem Serializer machst über eine Klasse machen die für den Export den Listen der jeweiligen Listboxen entsprechende Attribute in der XML zuweist, die du dann beim importieren entsprechend differenziert in die jeweilige Listbox einlesen kannst.
Das ist hier sehr schön beschrieben:
http://tech.pro/tutorial/798/csharp-tutorial-xml-serialization

Grüße Uwe
Mitglied: 115122
115122 Sep 19, 2014 at 10:57:38 (UTC)
Goto Top
Zitat von @colinardo:

Das ist hier sehr schön beschrieben:
http://tech.pro/tutorial/798/csharp-tutorial-xml-serialization

Grüße Uwe

Werde das mal testen und mich danach hier wieder melden. Danke für den Hinweis. face-smile
Member: colinardo
Solution colinardo Sep 19, 2014, updated at Sep 24, 2014 at 08:29:34 (UTC)
Goto Top
Falls du es nicht selber schaffen solltest es umzusetzen, habe ich dir mal ein VS2010-Demo-Projekt zusammengestellt: xml_serialization_249646.zip

Das Projekt nutzt für den Import im Gegensatz zum klassischen Auslesen via XMLDocument das direkte Umwandeln des XML-Codes in Objekte mit der Deserialize-Methode des XMLSerializer Objektes. Da du diesen ja schon für den Export benutzt hast bietet sich dies an.

Grüße Uwe
Mitglied: 115122
115122 Sep 22, 2014 at 06:01:14 (UTC)
Goto Top
Zitat von @colinardo:

Falls du es nicht selber schaffen solltest es umzusetzen, habe ich dir mal ein VS2010-Demo-Projekt zusammengestellt:
xml_serialization_249646.zip

Das Projekt nutzt für den Import im Gegensatz zum klassischen Auslesen via XMLDocument das direkte Umwandeln des XML-Codes in
Objekte mit der Deserialize-Methode des XMLSerializer Objektes. Da du diesen ja schon für den Export benutzt hast bietet
sich dies an.

Grüße Uwe

Wow danke für die Mühe, hatte übers Wochenende keine Zeit, werde mir das aber auf jeden Fall anschauen.

Grüße
Mitglied: 115122
115122 Sep 24, 2014 at 08:29:28 (UTC)
Goto Top
So, habe mit dem Link und der Demo alles hinbekommen, vielen Dank für die Hilfe. face-smile

Grüße