我使用的是Visual Studio 2013和C#。我动态创建TreeView并使用“添加”和“删除”按钮来创建树。
我想知道将treeView节点保存到文件的好方法是什么,这样我可以在下次启动应用程序时再次动态构建它?
我应该使用.ini文件吗? .XML?我想看看如何做到这一点的一个例子。一个小例子很好。
...谢谢
答案 0 :(得分:0)
您可以使用这两种格式存储数据。无论格式如何,您都需要定义一个类,其中Id表示每个节点,而parentId对于根元素可以为null。比你应该设置一个元素列表,然后序列化这些元素。序列化对象可以保存为Xml,也可以解析为任何其他格式,如Json甚至自定义格式,如ini文件。
这是一个示例实现。数据结构不是有效的树,但它为您提供了一个透视图。也许您可以阅读有关树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; }
}
}