Доступ ко всем узлам в TreeView Control

Вы могли, вероятно, обнаружить неактивность на своей веб-странице с помощью перечисленных приемов mousemove, но это не скажет Вам, что пользователь не находится на другой странице в другом окне или вкладке, или что пользователь находится в Word или Photoshop или WOW и просто не смотрит на Вашу страницу в это время. Обычно я просто делал бы упреждающую выборку и полагался бы на многозадачность клиента. Если Вы действительно потребность эта функциональность, Вы делаете что-то с элементом управления ActiveX в окнах, но это ужасно в лучшем случае

8
задан TigerhawkT3 5 May 2015 в 00:17
поделиться

3 ответа

Не используйте вложенные циклы, а используйте рекурсивное решение, например:

void ListNodes( TreeNode node )
{
  foreach( var subnode in node.Nodes )
  {
    ListNodes( subnode );
  }
  // Print out node
}

Вызовите эту функцию для корневого узла.

Для дополнительного вопроса: проверьте FullPath собственность.

9
ответ дан 3 November 2019 в 14:38
поделиться

Вы можете использовать рекурсивную функцию для обхода всего дерева:

private void Traverse(TreeNodeCollection nodes)
{
    foreach (TreeNode node in nodes)
    {
        Console.WriteLine("{0} -> {1}", node.Name, node.FullPath);
        Traverse(node.Nodes);
    }
}

Затем вы можете вызвать это, используя:

Traverse(treeView.Nodes);

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

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

6
ответ дан 3 November 2019 в 14:38
поделиться

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

    private int GetLevels(TreeNodeCollection treeNodes)
    {
        int level = 0;
        foreach (TreeNode node in TreeTopDown(treeNodes))
        {
            int i = node.Level;
            if (i > level) level = i;
        }
        return level;
    }

    //TopDown Iterator 
    private IEnumerable<TreeNode> TreeTopDown(TreeNodeCollection treeNodes)
    {
        foreach (TreeNode node in treeNodes)
        {
            yield return node;
            foreach (TreeNode subNode in TreeTopDown(node.Nodes)) yield return subNode;               
        }
    }

    //BottomUp Iterator
    private IEnumerable<TreeNode> TreeBottomUp(TreeNodeCollection treeNodes)
    {
        foreach (TreeNode node in treeNodes)
        {
            foreach (TreeNode subNode in TreeBottomUp(node.Nodes)) yield return subNode;
            yield return node;
        }
    }
5
ответ дан 3 November 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: