Вопросы по обновлению Treeview

#c# #treeview #refresh

#c# #просмотр дерева #обновить

Вопрос:

У меня есть Treeview, который пользователь не может редактировать. Способ, которым я пытаюсь обновить, — это очистить все дерево и повторно добавить все узлы (и дочерние элементы). Я добиваюсь этого с помощью следующих строк кода:

 treeView.BeginUpdate(); //Freeze drawing
treeView.Nodes.Clear(); //Empty Tree
addAllNodes();  //This adds the nodes for the tree and sets their name/text property
treeView.EndUpdate(); //Unfreeze drawing
  

Я пытался добавить метод Update и Refresh перед вызовом addAllNodes, но это ничего не изменило. Выполнение вышеуказанного приводит к ошибке:

Система.Исключение ArgumentException: не удается добавить или вставить элемент ‘NodeNameHere’ более чем в одно место. Сначала вы должны удалить его из текущего местоположения или клонировать

Мой первый вопрос заключается в том, что я делаю, чтобы вызвать эту ошибку, и как я могу правильно обновить свое дерево?

Мой второй вопрос заключается в том, могу ли я каким-либо образом восстановить расширенные узлы пользователя после обновления? (чтобы все в конечном итоге не рухнуло)

Комментарии:

1. Что касается второго вопроса, то для этого я сделал следующее: перед очисткой моего древовидного представления я перебираю узлы, и если узел расширен, я добавляю этот узел в список. Затем очистите и добавьте узлы обратно и выполните цикл по моему списку, расширяя узлы, которые есть в списке.

2. Я подходил к этому неправильно. Я пошел дальше и удалил только дочерние элементы, которые нуждались в обновлении. Любые статические узлы (добавленные из addAllNodes (), которые никогда не требовалось трогать). Все еще хотелось бы иметь способ запоминания всех развернутых узлов.

3. @John Arlen — Да, я просматривал строку отладки за раз, и дерево очищалось.

Ответ №1:

у каждого узла есть путь (называемый чем-то вроде .Path или .FullPath; прямо сейчас VS не открыт). Таким образом, вы можете обойти свои узлы перед их очисткой и записать все расширенные узлы, затем снова обойти их после обновления и посмотреть, совпадает ли путь узла с сохраненным. если это так, разверните его.