c# - ForEach TreeNode.Nodes 取出空节点

标签 c# recursion null nullreferenceexception

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

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);

无论如何,这已经运行了一段时间,但突然之间,我遇到了一个空引用异常。在进行一些调试之后,我注意到在 second 函数的 foreach 循环中,大约在第二次迭代时,一个 null TreeNode 被返回。

更奇怪的是,如果我用下面的代码替换 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 以及消息“集合已修改”。如果不更好地了解 Checked 属性 setter 的作用,使用 for 循环可能是一个很好的解决方法。

关于c# - ForEach TreeNode.Nodes 取出空节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9114603/

相关文章:

c# - 重载 == 运算符抛出带有非空操作数的 NullReferenceException

c# - 在 C# 中运行时,我可以更改我的程序托盘图标吗?

c - 为什么在使用 int 变量时会收到警告,而在使用整数常量时却不会?

javascript - Object.create(null) 的用例?

json - Swift 解析 json 读为 nil

c# - WPF View-ModelView 绑定(bind)需要帮助请

c# - 如何使用动态 Linq 来创建 Exists

java - 递归地将文件添加到 JList - 仅添加最后一个文件夹中的文件

bash - 如何使用 Bash 递归地创建不存在的子目录?

c++ - 了解使用堆栈实现队列的递归调用机制