2009-07-20 8 views
0
private void WalkerRefreshNode(bool refreshAllNodes) 
    { 
     TreeNode selectedNode = tree.SelectedNode; 
     TreeNode bufferedNode = (TreeNode)selectedNode.Clone(); 
     if (SelectedNode.Tag != null) 
     { 
      DataRow tag = (DataRow)selectedNode.Tag; 
      if (tag.Table.TableName == "example") 
      { 
       if ((selectedNode.Nodes.Count == 0) || refreshAllNodes) 
       { 
        selectedNode.Text += emptyNodeTempText; 
        this.ActionWalk((uint)tag["task0"], bufferedNode, 5); 
        selectedNode = bufferedNode; // -- doesn't work. 
        ... 
       } 
       ... 
      } 
      ... 
     } 
     ... 
    } 

^Voici le code que j'essaie de faire fonctionner. Je veux être en mesure de remplacer entièrement le nœud Sélectionné par un nœud personnalisé. Cependant, il ne réagit pas à mon affectation et le nœud reste inchangé. quelqu'un peut-il m'aider à surmonter ce problème?Impossible d'affecter TreeNode à Treeview.SelectedNode

Répondre

1

Tout d'abord, selectedNode est une variable locale, le paramètre n'a aucune incidence sur l'arborescence.

Frederik donne une bonne réponse que la façon de remplacer en fait un nœud dans l'arborescence, mais en fonction de vos commentaires ce que vous avez réellement besoin est:

tree.BeginUpdate(); 
try 
{ 
    this.ActionWalk((uint)tag["task0"], selectedNode, 5); 
} 
finally 
{ 
    tree.EndUpdate(); 
} 

Et si le chapeau est pas assez vite vous aurez considérer un arrière-plan ou quelque chose comme ça.

+0

autant que je sache, selectedNode fait référence à tree.SelectedNode, et quand j'ai essayé de mettre quelque chose à selectedNode, il s'est appliqué à tree.SelectedNode. BeginUpdate() et EndUpdate() ont résolu le problème, mais cela a bloqué la capacité de travailler avec le reste des nœuds qui ne sont pas mis à jour. –

+0

selectedNode est une copie (locale) de l'arbre.Référence SelectedNode. Le changer ne fait rien dans l'arbre. –

0

Il semble que c'est parce que "bufferedNode" est un clone de noeud dans treeview. Vous devez trouver le nœud d'origine dans treeview et définir celui-ci comme nœud sélectionné.

btw. Pourquoi clones-tu le noeud? Est-ce nécessaire?

EDIT:

La raison pour laquelle je fais c'est-à éviter réglage de référence bufferedNode à selectedNode, quand je suis traitement l'arbre de noeud dans ActionWalk() il est lent parce que TreeView doit être repeint chaque fois que j'ajoute un nœud (ralentit toute l'opération 10x). Donc, je voulait remplir la structure de nœud en arrière-plan , puis l'attribuer à l'arbre d'origine .

Avez-vous essayé d'appeler "BeginUpdate" et "EndUpdate" avant et après le ActionWalk()? Cela devrait empêcher la repeindre.

Si cela ne va pas aider. vous devez remplacer le noeud d'origine par le noeud cloné et les définir comme sélectionnés.

+0

La raison pour laquelle je fais cela est d'éviter la référence de paramètre bufferedNode à selectedNode, quand je traite l'arbre de noeud dans ActionWalk() c'est lent car TreeView doit être repeint chaque fois que j'ajoute un noeud 10x). Donc, je voulais remplir la structure du nœud en arrière-plan, puis l'affecter à l'arbre d'origine. –

2

Pour remplacer complètement un TreeNode vous devrez supprimer l'ancien noeud de la collection Nodes du nœud parent, et insérez le nouveau dans le même endroit:

private void ReplaceNode(TreeNode oldNode, TreeNode newNode) 
{ 
    int index = oldNode.Index; 
    TreeNodeCollection nodesCollection = oldNode.Parent.Nodes; 
    nodesCollection.RemoveAt(index); 
    nodesCollection.Insert(index, newNode); 
} 

Avec la méthode ci-dessus dans votre code , vous pouvez changer votre code comme ceci:

if ((selectedNode.Nodes.Count == 0) || refreshAllNodes) 
{ 
    selectedNode.Text += emptyNodeTempText; 
    this.ActionWalk((uint)tag["task0"], bufferedNode, 5); 
    ReplaceNode(selectedNode, bufferedNode); // -- should work. 
    ... 
} 

Notez que selectedNode se réfèrent toujours à l'ancien noeud après son remplacement.

Questions connexes