2011-05-03 2 views
8

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

Нет Я хочу, чтобы иметь возможность сохранить содержимое этого дерева в файл (в основном текстовый файл, который я называю * .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

Написать Информация о чем-то вроде класса Tree {List _ узлов; class Node {String Name; Строковый текст; String Tag;}}. Чем вы можете использовать сериализацию XML. Это самый универсальный способ, который я знаю. – alehro

+0

@alhero Спасибо, но для меня это немного сложно, можете ли вы привести примеры кода? –

+0

alehro ссылается на ['XmlSerializer'] (http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx). На этой странице есть довольно много примеров кода. – Timwi

ответ

17

Вы можете использовать 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); 
     } 
    } 
+0

Спасибо, работает отлично! –

Смежные вопросы