Не удается назначить TreeNode для Treeview.SelectedNode - PullRequest
0 голосов
/ 20 июля 2009
    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.
                   ...
                }
                ...
            }
            ...
        }
        ...
   }

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

Ответы [ 3 ]

2 голосов
/ 20 июля 2009

Чтобы полностью заменить 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 по-прежнему будет ссылаться на старый узел после его замены.

1 голос
/ 20 июля 2009

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

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

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

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

0 голосов
/ 20 июля 2009

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

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

EDIT:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...