Есть ли простой способ проверить расширение состояния TreeNode и его дочерних элементов?
bool IsAllNodesExpanded(TreeNode nodeToCheck)
{
// Use nodeToCheck.isExpanded
// Use something to check all childrens
// return something
}
Есть ли простой способ проверить расширение состояния TreeNode и его дочерних элементов?
bool IsAllNodesExpanded(TreeNode nodeToCheck)
{
// Use nodeToCheck.isExpanded
// Use something to check all childrens
// return something
}
Поскольку ваш вопрос относится к конкретному компоненту 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
. Ошибка исправлена
if(n.Nodes.Count>0)
, иначе в конечном узле он обнаружит, что он не расширен, потому что у него нет дочерних элементов, и он не может быть расширен.
- person MrJW; 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;
}
}
IsAllNodesExpanded
- person BendEg   schedule 07.06.2017