У меня есть некоторые узлы, добавленные в мой TreeView
(trvP). Корневой элемент имеет значение Tag
, установленное на Root
.Попытка установить все проверенные состояния узлов в дереве - получить StackOverflowException
Я пытаюсь сделать так, чтобы проверить корневой элемент, все остальные узлы будут иметь одинаковый статус. Однако выполнение кода ниже приводит к StackOverflowException
.
private void trvP_AfterCheck(object sender, TreeViewEventArgs e)
{
if(e.Node.Tag.Equals("Root"))
{
var nodes = TreeViewExtensions.GetAllNodes(e.Node.TreeView);
foreach (TreeNode node in nodes)
node.Checked = e.Node.Checked;
}
}
Код для GetAllNodes
функции:
public static List<TreeNode> GetAllNodes(this TreeView _trv)
{
List<TreeNode> result = new List<TreeNode>();
foreach (TreeNode child in _trv.Nodes)
{
result.AddRange(child.GetAllNodes());
}
return result;
}
public static List<TreeNode> GetAllNodes(this TreeNode _trn)
{
List<TreeNode> result = new List<TreeNode>();
result.Add(_trn);
foreach (TreeNode child in _trn.Nodes)
{
result.AddRange(child.GetAllNodes());
}
return result;
}
Кажется, от отладки, что он запускает var nodes = ...
часть кода снова и снова, в то время как только установка одного узла внутри foreach
петли (корневого узла) , Однако nodes
- это правильный список узлов с правильными значениями.
Я не понимаю, почему это происходит снова и снова, в результате чего возникает исключение.
Можете ли вы показать 'GetAllNodes()' 'расширение для TreeNode' (вы только показать один для' TreeView')? –
И я полагаю, что корневой узел будет первым в вашем списке, поэтому 'node.Checked = ...' снова вызовет обработчик 'trvP_AfterCheck()' для того же узла (хотя это не должно происходить, если в checkstate не было изменение). –
Добавлено, но, как сказано ниже, 'GetAllNodes' отлично работает, если я назову его для некоторого случайного дочернего элемента (который также имеет дочерние элементы) - это только корневой элемент, вызывающий проблемы. – Janushoff