none
C# XML in Listview laden RRS feed

  • Frage

  • Mein Problem ist ich weiß nicht wie ich die XML Datei die schon beim drücken auf Speichern erstellt wird:

    <?xml version="1.0" encoding="utf-8"?>
    <Items>
      <Item subitem1="Test1" subitem2="1" />
      <Item subitem1="Test2" subitem2="2" />
      <Item subitem1="Test3" subitem2="3" />
      <Item subitem1="Test4" subitem2="4" />
    </Items>

    Wieder beim erneuten starten in die ListView wieder einlesen kann. Speichern klappt.

    Das ist mein code fürs speichern. Falls es jemand sehen will:

    private void button_save_Click(object sender, EventArgs e)
    {
        FileStream fileStream;
        StreamWriter streamWriter;
        XmlTextWriter xmlTextWriter;
        string filename = @"c:\Users\Christoph\Documents\Overview.txt";
    
        try
        {
            // overwrite even if it already exists
            fileStream = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
    
            streamWriter = new StreamWriter(fileStream);
            xmlTextWriter = new XmlTextWriter(streamWriter);
            xmlTextWriter.Formatting = Formatting.Indented;
            xmlTextWriter.WriteStartDocument();
            xmlTextWriter.WriteStartElement("Items");
    
            const int SUBITEM1_POS = 0;
            const int SUBITEM2_POS = 1;
    
            for (int i = 0; i < listView1.Items.Count; i++)
            {
                String currentSubItem1 = listView1.Items[i].SubItems[SUBITEM1_POS].Text;
                String currentSubItem2 = listView1.Items[i].SubItems[SUBITEM2_POS].Text;
    
                xmlTextWriter.WriteStartElement("Item");
                xmlTextWriter.WriteAttributeString("subitem1", currentSubItem1.ToString());
                xmlTextWriter.WriteAttributeString("subitem2", currentSubItem2.ToString());
                xmlTextWriter.WriteEndElement();
            }
    
            xmlTextWriter.WriteEndDocument();
            xmlTextWriter.Flush();
            xmlTextWriter.Close();
        }
        catch (IOException ex)
        {
            // do something about your error
    
        }
    }

    Dienstag, 17. März 2015 19:17

Antworten

  • Hallo,
    ich gehe mal davon aus, das du WinForms benutzt. An deiner Stelle würde ich nicht auf das manuelle auslesen per Stream setzen, das geht über LINQ to XML deutlich komfortabler:
    string path = @"Overview.xml";//XML sollte auch als solches benannt sein...oder aber mit einer eigenen Endung versehen werden
                
    //using System.Xml.Linq
    foreach(var node in XDocument.Load(path).Root.Elements("Item"))
    {
        var lvi = new ListViewItem(node.Attribute("subitem1").Value);
        lvi.SubItems.Add(node.Attribute("subitem2").Value);
        listView1.Items.Add(lvi);
    }
    Und auch das speichern wäre in wenigen Zeilen erledigt:
    string path = @"Overview2.xml";
    
    var doc = new XDocument(new XElement("Items"));
    foreach (var item in listView1.Items.OfType<ListViewItem>())
    {
        var el = new XElement("Item");
        el.SetAttributeValue("subitem1", item.SubItems[0].Text);
        el.SetAttributeValue("subitem2", item.SubItems[1].Text);
        doc.Root.Add(el);
    }
    doc.Save(path);
    Das alles sollte soweit verständlich benannt sein. Wenn du trotzdem noch Fragen hast, beantworte ich dir diese gern.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 17. März 2015 20:24
    Moderator

Alle Antworten

  • Hallo,
    ich gehe mal davon aus, das du WinForms benutzt. An deiner Stelle würde ich nicht auf das manuelle auslesen per Stream setzen, das geht über LINQ to XML deutlich komfortabler:
    string path = @"Overview.xml";//XML sollte auch als solches benannt sein...oder aber mit einer eigenen Endung versehen werden
                
    //using System.Xml.Linq
    foreach(var node in XDocument.Load(path).Root.Elements("Item"))
    {
        var lvi = new ListViewItem(node.Attribute("subitem1").Value);
        lvi.SubItems.Add(node.Attribute("subitem2").Value);
        listView1.Items.Add(lvi);
    }
    Und auch das speichern wäre in wenigen Zeilen erledigt:
    string path = @"Overview2.xml";
    
    var doc = new XDocument(new XElement("Items"));
    foreach (var item in listView1.Items.OfType<ListViewItem>())
    {
        var el = new XElement("Item");
        el.SetAttributeValue("subitem1", item.SubItems[0].Text);
        el.SetAttributeValue("subitem2", item.SubItems[1].Text);
        doc.Root.Add(el);
    }
    doc.Save(path);
    Das alles sollte soweit verständlich benannt sein. Wenn du trotzdem noch Fragen hast, beantworte ich dir diese gern.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 17. März 2015 20:24
    Moderator
  • Vielen vielen dank :D Es funktioniert

    Weiß zwar jetzt nicht genau was das alles macht aber es geht :D Danke

    Grüße Christoph

    Dienstag, 17. März 2015 20:56