对于每个树节点.节点拉出空节点

本文关键字:节点 树节点 于每个 | 更新日期: 2023-09-27 18:22:10

我有两个递归方法,用于检查/取消选中.NET TreeView中的所有TreeNodes。这些方法非常简单:

private void SetAllNodes(TreeNode rootNode, bool value)
{
    rootNode.Checked = value;
    foreach (TreeNode node in rootNode.Nodes)
        SetAllNodes(node, value);
}
private void SetAllNodes(TreeView root, bool value)
{
    foreach (TreeNode node in root.Nodes)
        SetAllNodes(node, value);
}

我这样称呼它:

SetAllNodes(this.myTreeView, true);

无论如何,这已经很好地工作了一段时间,但突然之间,我得到了null reference exception。在进行了一些调试之后,我注意到在second函数的foreach循环中,大约在第二次迭代时,返回了nullTreeNode

更奇怪的是,如果我用以下代码替换foreach循环,错误就会消失:

for (int i = 0; i < root.Nodes.Count; i++)
{
   TreeNode node = root.Nodes[i];
   SetAllNodes(node, value);
}

你知道为什么会发生这种情况吗?我已经尽可能多地调试了,但简单的事实是,我从foreach循环中得到了一个null项。

编辑根据请求,这里是堆栈跟踪:

MyProgram.exe!MyProgram.UI.frmFilter.SetAllNodes(System.Windows.Forms.TreeNode rootNode = null, bool value = false) Line 457 + 0x7 bytes    C#
MyProgram.exe!MyProgram.UI.frmFilter.SetAllNodes(System.Windows.Forms.TreeView root = {System.Windows.Forms.TreeView}, bool value = false) Line 450 + 0x6a bytes    C#
MyProgram.exe!MyProgram.UI.frmFilter.btnNone_Click(object sender = {Text = "None"}, System.EventArgs e = {X = 36 Y = 5 Button = Left}) Line 604 C#
[External Code] 
MyProgram.exe!MyProgram.Program.Main(string[] args = {string[0]}) Line 33 + 0x1d bytes  C#
[External Code]

对于每个树节点.节点拉出空节点

我猜rootNode.Checked = value正在更改内部集合的结构,因此枚举器(foreach)以某种方式返回了对移动节点的引用。理想情况下,会抛出InvalidOperationException,并显示消息"collection was modified"。如果不更好地了解Checked属性setter正在做什么,那么使用for循环可能是一个不错的解决方案。