gpt4 book ai didi

c# - 如何在 TreeView 中修复 foreach

转载 作者:行者123 更新时间:2023-11-30 23:33:34 25 4
gpt4 key购买 nike

我正在通过本教程执行我的 treeview 删除按钮事件: Youtube tutorial

我做了所有与教程中所示相同的事情:

private void button2_Click(object sender, EventArgs e)
{
RemoveCheckedNodes(treeView1.Nodes);
}
List<TreeNode> checkedNodes = new List<TreeNode>();

void RemoveCheckedNodes(TreeNodeCollection nodes)
{
foreach (TreeNode node in nodes )
{
if (node.Checked)
{
checkedNodes.Add(node);
}
else
{
RemoveCheckedNodes(node.Nodes);
}
foreach (TreeNode checkedNode in checkedNodes)
{
nodes.Remove(checkedNode);
}
}
}

但它在 foreach 中引发了我的错误:“System.NullReferenceException”类型的未处理异常发生在 project_TreeView.exe 中

同样很奇怪的是,一切都适用于最后一个节点。所以我猜我的 foreach 不工作。有什么想法吗?

EDIT:So I found this is working, If I am removing last and before last node. How to make it, that I could remove any node(For example first and last)

谢谢。

最佳答案

我会将已检查节点的搜索移动到一个单独的方法中。所以你首先找到所有节点,然后删除它们。

目前您的代码会多次尝试删除相同的节点(在 RemoveCheckedNodes 的每次递归调用中,即使您将循环移出另一个循环,删除仍会被多次调用。

此外,我会为 checkedNodes 列表使用局部变量。您的列表未清除,因此它将包含已删除的项目。

如果您的问题是查找或删除节点,这种方式更易于调试:

  private void button2_Click(object sender, EventArgs e)
{
RemoveChecked(treeView1.Nodes);
}

void RemoveChecked(TreeNodeCollection nodes)
{
foreach (TreeNode checkedNode in FindCheckedNodes(nodes))
{
nodes.Remove(checkedNode);
}
}


private List<TreeNode> FindCheckedNodes(TreeNodeCollection nodes)
{
List<TreeNode> checkedNodes = new List<TreeNode>()
foreach (TreeNode node in nodes)
{
if (node.Checked)
{
checkedNodes.Add(node);
}
else
{
// find checked childs
checkedNodes.AddRange(FindCheckedNodes(node.Nodes));
}
}
return checkedNodes;
}

关于c# - 如何在 TreeView 中修复 foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33891492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com