.Net C#将treeView保存到文件的最佳方法?

时间:2016-04-15 05:59:42

标签: c# visual-studio treeview

我使用的是Visual Studio 2013和C#。我动态创建TreeView并使用“添加”和“删除”按钮来创建树。

我想知道将treeView节点保存到文件的好方法是什么,这样我可以在下次启动应用程序时再次动态构建它?

我应该使用.ini文件吗? .XML?我想看看如何做到这一点的一个例子。一个小例子很好。

...谢谢

1 个答案:

答案 0 :(得分:0)

您可以使用这两种格式存储数据。无论格式如何,您都需要定义一个类,其中Id表示每个节点,而parentId对于根元素可以为null。比你应该设置一个元素列表,然后序列化这些元素。序列化对象可以保存为Xml,也可以解析为任何其他格式,如Json甚至自定义格式,如ini文件。

编辑1

这是一个示例实现。数据结构不是有效的树,但它为您提供了一个透视图。也许您可以阅读有关树here的更多信息。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    public static class Program
    {
        private static void Main()
        {
            // Define your initial tree nodes.
            var tree = new List<TreeNode>
            {
                new TreeNode
                {
                    Id = 1,
                    ParentId = null,
                    Text = "Root Element 1"
                },
                new TreeNode
                {
                    Id = 2,
                    ParentId = null,
                    Text = "Root Element 2"
                },
                new TreeNode
                {
                    Id = 3,
                    ParentId = 1,
                    Text = "Child Element 1"
                },
                new TreeNode
                {
                    Id = 4,
                    ParentId = 3,
                    Text = "Grandchild Element 1"
                }
            };

            // Initialize serializer instance.
            var xmlSerializer = new XmlSerializer(tree.GetType());

            // Serialize your list. (Save into Xml File)
            using (var fileStream = File.OpenWrite("SerializerTest.xml"))
            {
                xmlSerializer.Serialize(fileStream, tree);
            }

            // Deserialize your stored Xml file into a new tree object.
            using (var fileStream = File.OpenRead("SerializerTest.xml"))
            {
                var loadedTree = xmlSerializer.Deserialize(fileStream) as List<TreeNode>;
                if (loadedTree != null)
                {
                    foreach (var node in loadedTree.Where(x => x.ParentId == null).ToList())
                    {
                        PrintNode(loadedTree, node);
                    }
                }
            }

            Console.ReadLine();
        }

        private static void PrintNode(List<TreeNode> tree, TreeNode node)
        {
            Console.WriteLine("Id: {0} - Text: {1}", node.Id, node.Text);
            var children = tree.Where(x => x.ParentId == node.Id).ToList();
            foreach (var child in children)
            {
                PrintNode(tree, child);
            }
        }
    }

    [Serializable]
    public class TreeNode
    {
        public int Id { get; set; }
        public int? ParentId { get; set; }
        public string Text { get; set; }
    }
}
相关问题