Can't assign TreeNode to Treeview.SelectedNode

Asked
Viewd1283

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.
                   ...
                }
                ...
            }
            ...
        }
        ...
   }

^ here is the code that I'm trying to get working. I want to be able to fully replace Selected node with custom node. However it doesn't react to my assignment and node remains unchanged. can someone help me to get over this problem?

3 ответов

1

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

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

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

А если вам не хватает скорости, вам придется подумать о фоновом работнике или что-то в этом роде.

  • Насколько мне известно, selectedNode - это ссылка на tree.SelectedNode, и когда я пытался установить что-то для selectedNode, он применялся к tree.SelectedNode. BeginUpdate () и EndUpdate () решили проблему, однако заблокировали возможность работы с остальными узлами, которые не обновляются.

    20 июля 2009, 08:52
  • selectedNode is a (local) copy of the tree.SelectedNode reference. Changing it does nothing in the Tree.

    Henk Holterman20 июля 2009, 09:13
2

In order to completely replace a TreeNode you will need to remove the old node from the parent node's Nodes collection, and insert the new one in the same location:

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

With the above method in your code, you can change your code like so:

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

Note that selectedNode will still refer to the old node after replacing it.

0

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

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

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

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

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

  • The reason why I’m doing that is to avoid bufferedNode setting reference to selectedNode, when I’m processing the node tree in ActionWalk() it’s slow because TreeView needs to be repainted every time I add a node(slows whole operation 10x). So I wanted to fill node structure in background and then assign it to the original tree.

    20 июля 2009, 08:15