Преобразование вида дерева в byte[], затем снова обратно

Я пытаюсь преобразовать вид дерева в байтовый массив, а затем обратно. пока форма загружается, она загружает структуру моих документов. Затем, насколько я знаю, он преобразует его в байтовый массив и обратно, но я не уверен, как преобразовать байтовый массив обратно в представление дерева. Вот мой код

namespace tree_view
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        string filepath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        ListDirectory(treeView1, filepath);
    }

    private static void ListDirectory(TreeView treeView, string path)
    {
        treeView.Nodes.Clear();

        var stack = new Stack<TreeNode>();
        var rootDirectory = new DirectoryInfo(path);
        var node = new TreeNode(rootDirectory.Name) { Tag = rootDirectory };
        stack.Push(node);

        while (stack.Count > 0)
        {
            var currentNode = stack.Pop();
            var directoryInfo = (DirectoryInfo)currentNode.Tag;
            foreach (var directory in directoryInfo.GetDirectories())
            {
                var childDirectoryNode = new TreeNode(directory.Name) { Tag = directory };
                currentNode.Nodes.Add(childDirectoryNode);
                stack.Push(childDirectoryNode);
            }
            foreach (var file in directoryInfo.GetFiles())
                currentNode.Nodes.Add(new TreeNode(file.Name));
        }

        treeView.Nodes.Add(node);
    }

    private Byte[] SerilizeQueryFilters()
    {
        BinaryFormatter bf = new BinaryFormatter();
        TreeNodeCollection tnc = treeView1.Nodes;

        List<TreeNode> list = new List<TreeNode>();
        list.Add(treeView1.Nodes[0]);

        using (MemoryStream ms = new MemoryStream())
        {
            bf.Serialize(ms, list);
            return ms.GetBuffer();
        }
    }

    private void DeSerilizeQueryFilters(byte[] items)
    {
        BinaryFormatter bf = new BinaryFormatter();
        List<TreeNode> _list = new List<TreeNode>();

        try
        {
            using (MemoryStream ms = new MemoryStream())
            {
                ms.Write(items, 0, items.Length);
                ms.Position = 0;
                _list = bf.Deserialize(ms) as List<TreeNode>;
                treeView2 = _list;
            }
        }
        catch { }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        byte[] data = SerilizeQueryFilters();
        DeSerilizeQueryFilters(data);
    }
}

Таким образом, бит, который дает мне ошибку на данный момент, это "treeView2 = _list;" как я "Не могу неявно преобразовать тип System.collections.generic.List в System.Windows.Forms.TreeView". У кого-нибудь есть идеи?

1 ответ

Решение

В вашем DeSerilizeQueryFilters() метод, который вы должны просто вызвать .AddRange() на вашем TreeView Nodes собрать и добавить все узлы из вашего списка.

_list = bf.Deserialize(ms) as List<TreeNode>;
treeView2.Nodes.AddRange(_list.ToArray()); //The parameter needs to be an array.

РЕДАКТИРОВАТЬ:

Кроме того, в вашем SerilizeQueryFilters() метод, который вы в настоящее время только добавляете первый TreeNode в ваш список. Чтобы добавить все узлы, просто замените:

list.Add(treeView1.Nodes[0]);

с:

foreach(TreeNode node in treeView1.Nodes)
{
    list.Add(node);
}
Другие вопросы по тегам