Как проверить, все ли подузлы TreeNode расширены?

Есть ли простой способ проверить расширение состояния TreeNode и его дочерних элементов?

bool IsAllNodesExpanded(TreeNode nodeToCheck)
{
  // Use nodeToCheck.isExpanded
  // Use something to check all childrens
  // return something
}

person MrJW    schedule 07.06.2017    source источник
comment
Только совет, если вы работаете с c#, используйте pascal case для методов. Например: IsAllNodesExpanded   -  person BendEg    schedule 07.06.2017


Ответы (2)


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

То, что вы хотите сделать, это в основном обход дерева , который представляет собой процесс обхода всех дочерних элементов дерева с учетом его корня. По сути, нам нужно проверить, являются ли все потомки (не дочерние элементы) узла. Разница между детьми и потомками заключается в том, что дети имеют одного и того же родителя (например, ABC являются детьми X тогда и только тогда, когда AB и C напрямую связаны с X), тогда как потомки могут быть «потомками детей детей... детей». (пример: A является потомком X, если, начиная с X, в дереве есть путь, который, начиная с узла X, идет вниз к узлу A ).

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

bool areAllNodesExpanded(TreeNode nodeToCheck){

    if(!nodeToCheck.IsExpanded)
        return false;
    foreach(TreeNode n in nodeToCheck.Nodes){
        if (n.Nodes.Count == 0)
            continue;
        if(!areAllNodesExpanded(n))
            return false;
    }
    return true;
}

Надеюсь это поможет.

LuxGiammi

РЕДАКТИРОВАТЬ: фрагмент кода выше не может быть скомпилирован из-за двух ошибок, которые я сделал: 1. это IsExpanded, а не isExpanded 2. По некоторым причинам я не хочу исследовать дальше, var n имеет тип объекта, тогда как он должен быть типа TreeNode. Ошибка исправлена

person LuxGiammi    schedule 07.06.2017
comment
Вы правы... Я пропустил заглавную букву, когда писал... Самое главное, чтобы объяснение того, что я делаю, было ясным и чтобы вы не копировали-и- вставьте код как есть. Это очень опасно! - person LuxGiammi; 07.06.2017
comment
После foreach должно быть if(n.Nodes.Count>0), иначе в конечном узле он обнаружит, что он не расширен, потому что у него нет дочерних элементов, и он не может быть расширен. - person MrJW; 12.06.2017
comment
Ошибка исправлена. Мне очень жаль, но я не проверял фрагмент кода. Я просто предположил, что лист дерева был расширен по определению (что не так :-D) - person LuxGiammi; 12.06.2017

Вместо использования TreeNode вы можете ввести свой собственный класс, производный от TreeNode. Этот класс может иметь рекурсивный метод IsAllNodesExpanded вроде этого: (не проверено)

public class MyTreeNode : TreeNode
{
  public bool IsAllNodesExpanded()
  {
    if (!IsExpanded)
    {
      return false;
    }

    bool allChildsExpanded = true;

    foreach (MyTreeNode child in Nodes.OfType<MyTreeNode>())
    {
      if (!child.IsAllNodesExpanded())
      {
        allChildsExpanded = false;
        break;
      }
    }

    return allChildsExpanded;
  }
} 
person user3292642    schedule 07.06.2017