Autor Beitrag
lordzwieback
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 17.11.14 13:01 
Hallöchen liebe Community,

ich habe ein Formular mit zwei Listboxen in welche ich Einträge schreiben kann, nennen wir sie mal box1 und box2. Ich kann Einträge hinzufügen, löschen, und von einer in die andere Box schieben.

Jetzt verzweifle ich mit dem Speichern und dem Laden der Daten. Ich dachte, XML wäre die beste Lösung dafür, habe aber vorher noch nie mit XML gearbeitet.

Mir schwebt eine Struktur wie diese vor:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
<box1>
 <entries>
  <entry name>
  <datetime>
  <notes>

  <entry name>
  <datetime>
  <notes>
 </entries>
</box1>

<box2>
 <entries>
  <entry name>
  <datetime>
  <notes>
 </entries>
</box2>


Ist das so überhaupt möglich ?

Ich habe schon diverse Online Tutorials gemacht, aber nie das Ergebnis bekommen, dass ich haben wollte. Für ein kleinwenig Hilfe wäre ich sehr dankbar.

Grüße,
lordzwieback

Moderiert von user profile iconTh69: Code- durch XML-Tags ersetzt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 17.11.14 13:31 
Hallo und :welcome:

der einfachste Weg geht über die Serialisierung.
Lies dir mal das Kurz-Tutorial Mit XmlSerializer Objekte als XML speichern und laden durch.
lordzwieback Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 17.11.14 13:36 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo und :welcome:

der einfachste Weg geht über die Serialisierung.
Lies dir mal das Kurz-Tutorial Mit XmlSerializer Objekte als XML speichern und laden durch.


Werd ich gleich mal machen, danke für den Hinweis.

EDIT:

Habe das jetzt mal so etwa auf mein Programm angepasst. Das Ganze schaut so aus..

Meine Klasse:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
public class Eintrag
        {
            public string art { get; set; }
            public string Bezeichnung { get; set; }
            public string Datum { get; set; }
        }


Meine SaveXML-Methode:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
private void SaveXML()
        {
            string dat = "";

            Eintrag eintrag = new Eintrag();
            if (chkTodo.Checked == true)
            {
                eintrag.art = "todo";
            }
            else
            {
                eintrag.art = "done";
            }
            eintrag.Bezeichnung = tbEintrag.Text;
            dat = DateTime.Now.ToString();
            eintrag.Datum = dat;
            XmlWriterSettings xws = new XmlWriterSettings();
            xws.Indent = true;
            xws.IndentChars = " ";
            XmlWriter xw = XmlWriter.Create("test.xml", xws);
            XmlSerializer xs = new XmlSerializer(typeof(Eintrag));
            xs.Serialize(xw, eintrag);
            xw.Close();
        }


Da ich ein Problem nach dem anderen lösen möchte und nicht alles auf einmal und das dann nicht richtig, folgende Fehler:

Ich bekomme momentan als Inhalt des XML Files folgenden Code:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
<?xml version="1.0" encoding="UTF-8"?>
-<Eintrag xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <art>todo</art>
   <Bezeichnung>tzhtzhzhtzh</Bezeichnung>
   <Datum>17.11.2014 13:24:56</Datum>
</Eintrag>


Jedoch wird der Eintrag, welcher gerade in dem XML File steht jedes mal überschrieben, wenn ich einen neuen Eintrag in die Listbox schreibe.

Die Save-Methode rufe ich momentan beim Zufügen eines Eintrages in die Listbox auf.

Es tut mir Leid falls ich etwas ganz Einfaches übersehe, ich bin jemand, der manchmal das Offensichtliche gekonnt ignoriert. :gruebel:
SuperEgon
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Di 18.11.14 11:12 
Naja jedes mal wenn du deine XMLSave-Methode Aufrufst erzeugst du scheinbar einen neuen Eintrag und speicherst den unter test.xml

Dann wird der natürlich überschrieben. Speichere doch den Inhalt der ganzen Listbox in dem XML und nicht jeden Eintrag in einer einzelnen. Dafür musst du nur deinen Code wie folgt anpassen...

ausblenden C#-Quelltext
1:
2:
XmlSerializer xs = new XmlSerializer(typeof(List<Eintrag>)); 
//Nicht ein Eintrag sondern eine Liste von Elementen des Typs Eintrag


ausblenden C#-Quelltext
1:
2:
xs.Serialize(xw, (List<Eintrag>)DeineListbox.Items );  
//ein Typecast auf (List<Eintrag>) weil Listbox.Items eine Liste vom Typ List<object> ist. Voraussetzung ist das deine Libo nur Items vom Typ Eintrag hat.

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt