2011-05-03 4 views
8

Nel mio programma C# WinForms ho una treeview che contiene solo nodi padre (quindi, nessun child) è come una listbox ma io ne avevo bisogno a causa di avere proprietà differenti di nodi come Nome, Tag e Testo.Salvare il contenuto di una treeview in un file e caricarlo in seguito

No Desidero poter salvare il contenuto di questa struttura ad albero in un file (in pratica un file di testo che io chiamo * .MVIA). La domanda è qual è il modo migliore per salvare tutte e tre le proprietà dei nodi in un file in modo che possa essere caricato nuovamente in un secondo momento?

Al momento mi è venuto con questa idea:

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

Come si può vedere, ogni proprietà Nome di ogni nodo verrà salvato in una linea. Ora ho bisogno di aggiungere anche la proprietà Text e Tag, ma in seguito ho difficoltà a leggerlo (Onestamente non so come farlo).

Vuoi darmi qualche idea su quale sia il modo migliore per salvare tutte e tre le proprietà di ogni nodo e riuscire a caricarlo facilmente in seguito?

Grazie.

+1

Write informazioni a qualcosa di simile classe Tree {List _ nodi; class Node {String Name; String Text; Tag stringa;}}. Di quanto tu possa usare la serializzazione XML. È il modo più universale che conosco. – alehro

+0

@alhero Grazie, ma è un po 'complicato per me, puoi dare qualche esempio di codice? –

+0

alehro fa riferimento a ['XmlSerializer'] (http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx). C'è un bel po 'di codice di esempio su quella pagina. – Timwi

risposta

17

È possibile utilizzare BinaryFormatter per serializzare/deserializzare nodi

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

Grazie, funziona perfettamente! –