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

.Net C# best way to save treeView to file?

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

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

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

谢谢...

您可以使用这两种格式来存储数据。无论格式如何,您都需要定义一个 class,其中包含一个代表每个节点的 Id 和一个对于根元素可以为 null 的 parentId。比你应该设置一个元素列表然后序列化它们。序列化对象可以保存为 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; }
    }
}