对于每个树节点.节点拉出空节点
本文关键字:节点 树节点 于每个 | 更新日期: 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
循环中,大约在第二次迭代时,返回了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,并显示消息"collection was modified"。如果不更好地了解Checked属性setter正在做什么,那么使用for
循环可能是一个不错的解决方案。