2009-07-20 9 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. 
        ... 
       } 
       ... 
      } 
      ... 
     } 
     ... 
    } 

^вот код, который я пытаюсь получить. Я хочу, чтобы полностью заменить выбранный узел на пользовательский узел. Однако он не реагирует на мое назначение, и узел остается неизменным. может кто-нибудь помочь мне преодолеть эту проблему?Невозможно назначить TreeNode Treeview.SelectedNode

ответ

1

Прежде всего, selectedNode - это локальная переменная, настройка которой не влияет на дерево вообще.

Frederik дает хороший ответ, как на самом деле заменить узел в дереве, но на основе ваших комментариев, что вы на самом деле нужно:

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

И если шлем не достаточно быстро, вы будете иметь рассмотреть Работника Форекса или что-то в этом роде.

+0

Насколько я знаю, selectedNode является ссылкой на tree.SelectedNode, и когда я попытался установить что-то в selectedNode, он применяется к tree.SelectedNode. BeginUpdate() и EndUpdate() решили проблему, однако она заблокировала способность работать с остальными узлами, которые не обновляются. – 2009-07-20 08:52:19

+0

selectedNode - это (локальная) копия дерева.Ссылка SelectedNode. Изменение этого ничего не делает в Дереве. –

0

Кажется, это потому, что «bufferedNode» является клоном узла в treeview. Вы должны найти исходный узел в treeview и установить его как выбранный узел.

кстати. почему вы клонируете узел? Это необходимо?

EDIT:

Причина, почему я делаю это, чтобы избежать bufferedNode установки ссылки на selectedNode, когда я обработки дерева узлов в ActionWalk() это медленно, потому что TreeView должен быть перекрашен каждый раз, когда я добавляю узел (замедляет всю операцию 10x). Итак, я хотел заполнить структуру узла в фоновом режиме , а затем присвоить его исходному дереву .

Вы пытались называть «BeginUpdate» и «EndUpdate» до и после ActionWalk()? Это должно предотвратить перекраску.

Если это не поможет. вам нужно заменить исходный узел клонированным узлом и после этого установить их как выбранные.

+0

Причина, по которой я делаю это, заключается в том, чтобы избежать привязки ссылки bufferedNode к выбранномуNode, когда я обрабатываю дерево узлов в ActionWalk(), это медленно, потому что TreeView необходимо перекрасить каждый раз, когда я добавляю узел (замедляет всю операцию 10x). Поэтому я хотел заполнить структуру узла в фоновом режиме и затем назначить его исходному дереву. – 2009-07-20 08:15:43

2

Для того, чтобы полностью заменить TreeNode вам нужно будет удалить старый узел из Nodes коллекции родительского узла, и вставьте новый в том же месте:

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

с описанным выше способом в коде вы можете изменить свой код, например, так:

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

Обратите внимание, что selectedNode будет по-прежнему относится к старому узлу после замены.

Смежные вопросы