我有两个递归方法,用于检查/取消检查 .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/