Сохранение содержимого дерева в файл и загрузка его позже - PullRequest
9 голосов
/ 03 мая 2011

В моей программе C # WinForms у меня есть древовидное представление, которое содержит только родительские узлы (то есть без дочерних элементов), оно похоже на список, но оно мне было нужно из-за наличия разных свойств узлов, таких как Name, Tag и Text.

Нет. Я хочу иметь возможность сохранить содержимое этого древовидного представления в файл (в основном текстовый файл, который я называю * .MVIA). Вопрос в том, каков наилучший способ сохранить все три свойства узлов в файле, чтобы он мог снова корректно загрузиться позже?

На данный момент я пришел с этой идеей:

    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());
        }            
    }

Как видите, каждое свойство Name каждого узла будет сохранено в строке. Теперь мне нужно добавить его свойство Text и Tag, но позже у меня возникают проблемы с его чтением обратно (честно говоря, я не знаю, как это сделать).

Не могли бы вы дать мне несколько идей о том, как наилучшим образом сохранить все три свойства каждого узла и легко загрузить его позже?

Спасибо.

1 Ответ

19 голосов
/ 03 мая 2011

Вы можете использовать BinaryFormatter для сериализации / десериализации узлов

    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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...