115122
Sep 19, 2014, updated at Sep 24, 2014 (UTC)
1854
5
0
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:
Dort, wo jeweils beim Eintragen etwas gespeichert werden soll, habe ich die Funktion aufgerufen, siehe Beispiel:
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
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
Please also mark the comments that contributed to the solution of the article
Content-Key: 249646
Url: https://administrator.de/contentid/249646
Printed on: April 19, 2024 at 19:04 o'clock
5 Comments
Latest comment
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
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
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
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