11

In my C# WinForms program I have a treeview that only contains parent nodes (so, no childs) it is like a listbox but I needed it because of haveing differet properties of nodes like Name, Tag and Text.

No I want to be able to save the content of this treeview into a file (Basically a text file which I call it *.MVIA). The question is what is the best way to save all three properties of nodes in a file so it can loaded again later properly?

At the moment I came with this idea :

    private void menuFileSave_Click(object sender, EventArgs e)
    {
        StringBuilder sb = new StringBuilder();

        foreach(TreeNode node in treeViewFiles.Nodes)
        {
            sb.AppendLine(node.Name);
        }

        SaveFileDialog saveList = new SaveFileDialog();

        saveList.DefaultExt = "*.mvia";
        saveList.Filter = "MVIA Files|*.mvia";

        if (saveList.ShowDialog() == DialogResult.OK)
        {
            File.WriteAllText(saveList.FileName, sb.ToString());
        }            
    }

As you can see, each Name property of each node will be saved in a line. Now I need to add its Text and Tag property also, but later I have trouble reading it back (Honestly I don't know how to).

Would you give me some ideas what is a best way to save all three property of each node and be able to load it easily later?

Thanks.

Stecya
  • 22,896
  • 10
  • 72
  • 102
Dumbo
  • 13,555
  • 54
  • 184
  • 288
  • 1
    Write info to something like class Tree { List _ nodes; class Node {String Name; String Text; String Tag;}}. Than you can use XML serialization. It is most universal way I know. – alehro May 03 '11 at 11:37
  • @alhero Thanks, but it is a bit complicated for me, can you give some code examples? – Dumbo May 03 '11 at 11:39
  • alehro is referring to [`XmlSerializer`](http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx). There is quite a bit of example code on that page. – Timwi May 03 '11 at 11:44

1 Answers1

22

You can use BinaryFormatter to Serialize/Deserialize Nodes

    public static void SaveTree(TreeView tree, string filename)
    {
        using (Stream file = File.Open(filename, FileMode.Create))
        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(file, tree.Nodes.Cast<TreeNode>().ToList());
        }
    }

    public static void LoadTree(TreeView tree, string filename)
    {
        using (Stream file = File.Open(filename, FileMode.Open))
        {
            BinaryFormatter bf = new BinaryFormatter();
            object obj = bf.Deserialize(file);

            TreeNode [] nodeList = (obj as IEnumerable<TreeNode>).ToArray();
            tree.Nodes.AddRange(nodeList);
        }
    }
Stecya
  • 22,896
  • 10
  • 72
  • 102
  • 1
    In order to save classes embedded in the node tag be sure they are serializable. See this answer for an example: [Lost data when serializing treeview](https://stackoverflow.com/a/49927843/1582588). – Shrout1 Apr 19 '18 at 18:36