【发布时间】:2017-02-20 13:45:11
【问题描述】:
我的TreeView (trvP) 添加了一些节点。根元素的Tag 属性设置为Root。
我正在努力做到这一点,所以如果我检查根元素,所有其他节点都将具有相同的状态。但是,执行下面的代码会导致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 是具有正确值的节点的正确列表。
我不明白为什么一遍又一遍地执行导致异常。
【问题讨论】:
-
你能显示
TreeNode的扩展名GetAllNodes()吗(你只显示TreeView的扩展名)? -
我猜根节点将是您列表中的第一个,因此
node.Checked = ...将再次为同一个节点调用处理程序trvP_AfterCheck()(尽管如果检查状态没有改变,这不应该发生)。 -
已添加,但如下所述,如果我将
GetAllNodes称为一些随机子元素(也有子元素),它可以正常工作 - 它只是导致问题的根元素。