2017-11-15 1 views
0

ich eine große -Datei haben, in dem die Daten wie folgt angeordnet ist:Analyse von Json; Sendet Daten an den TreeView Zweig

  • id - Artikel-ID
  • Eltern - Eltern-ID
  • Name - Name

    ... { ID: "2859", parent: "5853", Name: "Moskau" }, ...

muss ich es in TreeView werfen. Hilfe bitte = (

Jetzt habe ich es zu tun auf diese Weise:

RootObject data = JsonConvert.DeserializeObject<RootObject>(content); 

     foreach (var _data in data.data) 
     { 
      bool find = false; 

      foreach(TreeNode n in Regions.Nodes) 
      { 
       if (n.Name == _data.parent) 
       { 
        bool find2 = false; 
        n.Nodes.Add(_data.id, _data.name); 
        find = true; 
       } 
      } 

      if (find != true) 
      { 
       Regions.Nodes.Add(_data.id, _data.name); 
      } 

     } 

Json File

+0

Können Sie erklären, dass die JSON Struktur obwohl eigentlich flach ist? Besteht die Möglichkeit, dass sich ein Eintrag in der Datei früh auf die ID eines Knotens bezieht, der später definiert wird? –

Antwort

0

Ihr Code funktioniert nicht richtig aus zwei Gründen:

  1. Sie gehen davon aus, dass, wenn ein Element Englisch: www.doc-o-matic.com/webhelp/TdlgEditEdit.html Hat ein Elternteil, wird dieses Elternteil in den Daten zuerst kommen, und deshalb wird es dem Baum hinzugefügt, wenn Sie versuchen, es zu finden, aber das trifft nicht zu Kette von IDs in den Daten gibt es Fälle, für die der Elternartikel nach das Kind erscheint.
  2. Sie behandeln nicht den Fall, in dem sich das übergeordnete Element eines Elements nicht auf der Stammebene befindet. Wenn das übergeordnete Objekt eines Elements zuvor als untergeordnetes Element eines Knotens auf Stammebene in den Baum eingefügt wurde, wird es nicht in der Stammknotenliste gefunden. Daher fügen Sie das Element dem Stamm und nicht dem richtigen übergeordneten Element hinzu.

Was Sie tun müssen, ist Prozess die Daten in zwei Durchgängen eine Wörterbuchsuche mit:

Erstellen Sie zunächst alle einzelnen TreeNodes aus den Daten und fügen Sie sie in einem Wörterbuch, von ID eingegeben.
Dann iterieren Sie die Daten ein zweites Mal und suchen Sie für jedes Element den entsprechenden Knoten und seinen Elternknoten im Wörterbuch anhand ihrer jeweiligen IDs. Wenn das übergeordnete Element gefunden wird, fügen Sie den Knoten der Knotenliste des übergeordneten Elements hinzu, andernfalls fügen Sie ihn der Stammknotenliste hinzu.

Hier ist, wie es in Code aussehen:

void PopulateTreeViewFromJson(TreeView treeView, string json) 
{ 
    RootObject root = JsonConvert.DeserializeObject<RootObject>(json); 

    var dict = root.data.ToDictionary(n => n.id, 
     n => new TreeNode(n.name.Trim()) { Name = n.id }); 

    foreach (var item in root.data) 
    { 
     TreeNode node = dict[item.id]; 
     TreeNode parentNode; 
     if (dict.TryGetValue(item.parent, out parentNode)) 
     { 
      parentNode.Nodes.Add(node); 
     } 
     else 
     { 
      treeView.Nodes.Add(node); 
     } 
    } 
}