2011-05-03 22 views
8

W moim programie C# WinForms mam widok drzewa, który zawiera tylko węzły nadrzędne (więc nie ma potomków) jest jak listbox, ale potrzebowałem go z powodu posiadania różnych właściwości węzły takie jak Name, Tag i Text.Zapisywanie zawartości widoku drzewa do pliku i ładowanie go później

Nie Chcę, aby móc zapisać zawartość tego widoku drzewa do pliku (zasadniczo jest to plik tekstowy, który nazywam * .MVIA). Pytanie brzmi, jaki jest najlepszy sposób na zapisanie wszystkich trzech właściwości węzłów w pliku, aby mógł zostać ponownie załadowany później poprawnie?

W tej chwili przyszedł z tym pomysłem:

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

Jak widać, każda nieruchomość Nazwa każdego węzła zostanie zapisany w jednej linii. Teraz muszę dodać również jego właściwość Tekst i znacznik, ale później mam problem z odczytaniem go (Naprawdę nie wiem jak to zrobić).

Czy mógłby mi pan podać kilka pomysłów, jaki jest najlepszy sposób na zapisanie wszystkich trzech właściwości każdego węzła i możliwość łatwego załadowania go później?

Dzięki.

+1

Zapis informacji na coś klasy Drzewa {list _ węzły; Węzeł klasy {Nazwa ciągu; Tekst ciąg; Tag ciągu;}}. Następnie możesz skorzystać z serializacji XML. Jest to najbardziej uniwersalny sposób, jaki znam. – alehro

+0

@alhero Dzięki, ale jest to dla mnie nieco skomplikowane, czy możesz podać przykłady kodu? –

+0

alehro odnosi się do ['XmlSerializer'] (http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx). Na tej stronie jest całkiem sporo przykładowego kodu. – Timwi

Odpowiedz

17

Można użyć BinaryFormatter do serializacji/deserializacji Węzły

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

Dzięki, działa idealnie! –

Powiązane problemy