2016-04-01 8 views
0

Ich versuche, eine Baumansicht in ein Byte-Array und dann wieder zurück zu konvertieren. Soweit das Formular geladen wird, lädt es die Struktur meiner Dokumente. Dann, soweit ich weiß, wird es in ein Byte-Array und zurück konvertiert, aber ich bin mir nicht sicher, wie ich das Byte-Array zurück in die Baumansicht konvertieren soll. Hier ist mein CodeBaumansicht in Byte [] konvertieren, dann wieder zurück

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

So sind die Bit, das ist mir der Fehler im Moment gibt, ist "TreeView2 = _list;" wie ich "Typ System.collections.generic.List zu System.Windows.Forms.TreeView nicht implizit konvertieren kann". Hat jemand irgendwelche Ideen?

+0

* „im eine Baumansicht auf ein Byte-Array zu konvertieren versuchen, und dann wieder zurück“ * - das nennt man Serialisierung. Binäre Serialisierung ist die schlechteste Wahl sowie Sie können es nicht verwenden, um Zustand der komplizierten Steuerung wie "TreeView" direkt zu serialisieren. Betrachten Sie: 1) Verwenden Sie eine andere Serialisierung (XmlSerializer, JSON) 2) zu speichern Zustand - Daten in etwas konvertieren (zB 'TreeView.Nodes' -> hierarchische' List ') und serialisieren, um zu restaurieren - zuerst etwas zu lesen und dann fügen Sie Elemente einzeln hinzu. – Sinatr

+0

Alle visuellen Dinge wie 'TreeNode' sind keine gute Wahl für jede Persistenz, so wie' BinaryFormatter' keine gute Wahl für die Implementierung von Persistenz mit Serialisierung/Deserialisierung ist. Es ist besser, eigene DTO/Model-Klassen zu haben, die leicht serialisiert/deserialisiert werden können, indem sie eine beliebige API verwenden, die portables Format (XML, JSON, etc.) bietet. – Dennis

+0

Ich sollte wahrscheinlich von besagtem ich bin nicht ein guter Programmierer und ich verstehe nicht wirklich von dem, was gerade gesagt wurde lol, ich machte nicht den Code, aber das ist der einzige Code, den ich finden konnte. Ich bin nicht auf der Suche nach 100% effektiv, voller Beweis Weg, nur etwas, das für jetzt funktioniert, wenn Sie das –

Antwort

0

In Ihrer DeSerilizeQueryFilters() Methode sollten Sie in der Lage sein, .AddRange() auf Ihrer TreeView Nodes Sammlung nur anzurufen und alle Knoten aus Ihrer Liste hinzuzufügen.

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

EDIT:

Auch in Ihrer SerilizeQueryFilters() Methode, die Sie gerade das Hinzufügen nur die ersten TreeNode auf Ihre Liste. Um alle Knoten fügen Sie einfach ersetzen:

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

mit:

foreach(TreeNode node in treeView1.Nodes) 
{ 
    list.Add(node); 
} 
+0

danke sein ! es funktioniert perfekt jetzt –

+0

@RachelDocker: Gern geschehen. :) –

Verwandte Themen