TreeView n’arrive pas à afficher les nouveaux nœuds ajoutés au hasard

J’ai une application TreeView dans WinForm et j’utilise les méthodes d’ajout, de reorder et de delete pour append de nouveaux nœuds, réorganiser les nœuds existants et supprimer les anciennes notes.

Parfois, lorsque j’ajoute un nouvel élément, il apparaît immédiatement dans TreeView , mais il s’affiche correctement lorsque j’ajoute le nœud suivant. Cela semble se produire au hasard, il est donc difficile de trouver la cause profonde.

Même lorsque le nœud ne s’affiche pas correctement dans l’interface utilisateur, le nombre de nœuds est correct.

 TreeView1.BeginUpdate(); TreeView1.Nodes.Add("P1", "Parent"); foreach(User u in items) { if( condition) { node.Text =u.sNodeText; node.Tag = u; node.Text = u.sNodeText; GetChildren(node); TreeView1.Nodes["P1"].Nodes.Add((TreeNode)node.Clone()); } } TreeView1.ExpandAll(); TreeView1.EndUpdate(); TreeView1.Refresh(); 

Quelqu’un peut-il répondre à cette question? Je pense que la question n’est pas dénuée de sens. Voici la méthode GetChildren.

  private void GetChildren(TreeNode node) { TreeNode Node = null; User nodeCat = (User)node.Tag; foreach (User cat in items) { if (cat.sParentID == nodeCat.sID) { Node = node.Nodes.Add(cat.sNodeText); Node.Tag = cat; GetChildren(Node); } } 

Avez-vous essayé Invalidate() versus Refresh() ? Actualiser ne redessine que la zone Client, tandis que Invalidate redessine la totalité du contrôle. C’est juste un coup dans le noir … Je n’ai jamais rencontré ce problème auparavant.

Tout d’abord, après avoir appelé la méthode GetChildren, pourquoi ajoutez-vous le nœud à l’arborescence de toute façon? vous ne devez l’append à l’arborescence que si son parent est vide (ou nul ou 0 selon son type). Dans Addition, ajoutez la méthode EnsureVisible à votre noeud nouvellement ajouté et supprimez le clonage:

 ... if (u.sParentID==null) { TreeView1.Nodes["P1"].Nodes.Add(node); node.EnsureVisible(); } ... 

J’espère que cela t’aides

Si je ne me trompe pas n’est-il pas un

 TreeView1.BeginUpdate() method that you could use and at the end utilize the TreeView1.EndUpdate(); 

Je pense que cela pourrait être lié à l’utilisation de Clone, qui produit une copie superficielle . Le nombre de nœuds est mis à jour en raison de l’utilisation de la méthode Add, mais le “nouveau” nœud dispose toujours de la référence à partir de laquelle il a été créé, ce n’est donc pas un object unique. Essayez plutôt de créer une copie complète et voyez comment cela se passe.

par exemple:

 public TreeNode DeepNodeClone(TreeNode src) { MemoryStream ms = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, src); ms.Position = 0; object obj = bf.Deserialize(ms); ms.Close(); return (TreeNode)obj; } 

Ajoutez ensuite ce nœud en tant qu’enfant à votre nœud parent souhaité.