TreeView дублирует корневые узлы, несмотря на наличие единственного корня в массиве узлов - PullRequest
0 голосов
/ 25 марта 2019

В настоящее время я использую TreeView для отображения дерева файлов для визуализации различий в проекте контроля версий. У меня есть метод «Diff», который рекурсивно редактирует существующий узел в корневом массиве «Nodes» в TreeView, а затем обновляет дерево.

Однако я столкнулся с проблемой, когда корневой узел будет дублироваться, по-видимому, без причины, несмотря на то, что отладчик сказал мне, что в самом массиве TreeView есть один элемент в массиве «Узлы», без указания ошибка.

Я уже пытался использовать "Nodes.Clear()", а затем повторно добавить нарушающий узел, однако даже при очистке массива дубликат сохраняется (даже когда Nodes.Count равно 0). Я также пытался использовать BeginUpdate() и EndUpdate(), но безрезультатно.

Вот MCVE:

public partial class BrokenControl : TreeView
{
   public BrokenControl()
   {
       InitializeComponent();
   }

   public void Go(object sender, EventArgs e)
   {
       Nodes.Add("Root");
       Nodes[0] = RecursiveEdit(Nodes[0]);
       Update();
   }

   //This function simply recursively edits the Nodes array.
   int iterations = 10;
   private TreeNode RecursiveEdit(TreeNode node)
   {
      node.Nodes.Add(iterations.ToString());
      iterations--;
      if (iterations<=0)
      {
          return node;
      }

      RecursiveEdit(node.Nodes[0]);
      return node;
   }
}

Как уже упоминалось, я ожидаю, что в TreeView будет только один узел при его обновлении, но вместо этого я получу дублирующий узел, содержащий дублированное содержимое первого.

1 Ответ

1 голос
/ 25 марта 2019

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

До сих пор не знаю, что вызвало обман, даже когда Nodes.Count было 0 и 1, однако, похоже, это работает.

Исправлено MCVE:

public partial class BrokenControl : TreeView
{
   ...

   public void Go(object sender, EventArgs e)
   {
       Nodes.Add("Root");
       TreeNode savedNode = RecursiveEdit(Nodes[0]);

       //This fixes it.
       Nodes.Clear();
       Nodes.Add(savedNode);

       Update();
   }

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