Jam*_*mes 7 .net c# iteration treeview winforms
如何轻松遍历TreeView中的所有节点,检查其.Checked属性,然后删除所有已检查的节点?
它似乎很简单,但你不应该修改你正在迭代的集合,从而消除了"foreach"循环的可能性.(.Nodes.Remove调用正在修改集合.)如果尝试这样做,效果是只有大约一半的.Checked节点被删除.
即使一个人使用两个传递:首先创建一个临时索引列表,然后在第二次传递时通过索引删除 - 每次删除时索引都会改变,从而使索引列表的完整性无效.
那么,最有效的方法是什么?
下面是一个看起来不错的代码示例,但实际上只删除了大约一半的.Checked节点:
foreach (TreeNode parent in treeView.Nodes)
{
if (parent.Checked)
{
treeView.Nodes.Remove(parent);
}
else
{
foreach (TreeNode child in parent.Nodes)
{
if (child.Checked) parent.Nodes.Remove(child);
}
}
}
Run Code Online (Sandbox Code Playgroud)
(是的,目的只是从两层深度的树中修剪节点.)
尝试向后穿过节点.这样,您的索引不会超过您的节点大小:
for( int ndx = nodes.Count; ndx > 0; ndx--)
{
TreeNode node = nodes[ndx-1];
if (node.Checked)
{
nodes.Remove(node);
}
// Recurse through the child nodes...
}
这将在枚举后删除节点,并且可以递归地用于n层节点.
void RemoveCheckedNodes(TreeNodeCollection nodes)
{
List<TreeNode> checkedNodes = new List<TreeNode>();
foreach (TreeNode node in nodes)
{
if (node.Checked)
{
checkedNodes.Add(node);
}
else
{
RemoveCheckedNodes(nodes.ChildNodes);
}
}
foreach (TreeNode checkedNode in checkedNodes)
{
nodes.Remove(checkedNode);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6483 次 |
| 最近记录: |