C# 如何删除未选择的treeview节点

C# 如何删除未选择的treeview节点,c#,treeview,C#,Treeview,如何删除未选择的treeview节点。即使我循环了两次,在删除所有未选中的树节点之前,仍然需要单击按钮三次。 这就是我们所拥有的: private void buttonShowSelected_Click(object sender, EventArgs e) { for (int i = 0; i < treeViewFilter.Nodes.Count; i++) {

如何删除未选择的treeview节点。即使我循环了两次,在删除所有未选中的树节点之前,仍然需要单击按钮三次。 这就是我们所拥有的:

    private void buttonShowSelected_Click(object sender, EventArgs e)
            { 
                for (int i = 0; i < treeViewFilter.Nodes.Count; i++)
                {
                    DeleteUnselectedNodes();               
                }
            }


 private void DeleteUnselectedNodes()
 {
     for (int i = 0; i < treeViewFilter.Nodes.Count; i++)
     {
         TreeNode aNode = treeViewFilter.Nodes[i];
         treeViewFilter.SelectedNode = aNode.FirstNode;

         if (!aNode.Checked)
         {
             treeViewFilter.Nodes.Remove(aNode);
         }
     }
 }
private void按钮showselected\u单击(对象发送者,事件参数e)
{ 
对于(int i=0;i
您应该递归地遍历树

private void buttonShowSelected_Click(object sender, EventArgs e)
{
    var nodes = new List<TreeNode>(treeViewFilter.Nodes.Cast<TreeNode>());
    foreach (var treeNode in nodes)
    {
        DeleteUnselectedNodes(treeNode);
    }
}

private void DeleteUnselectedNodes(TreeNode node)
{
    var nodes = new List<TreeNode>(node.Nodes.Cast<TreeNode>());
    foreach (var treeNode in nodes)
    {
        DeleteUnselectedNodes(treeNode);
    }

    if (!node.Checked)
    {
        var parent = node.Parent;
        if (parent != null) //If it isn't root
        {
            parent.Nodes.Remove(node);
        }
        else
        {
            treeViewFilter.Nodes.Remove(node);
        }
    }
}
private void按钮showselected\u单击(对象发送者,事件参数e)
{
var nodes=新列表(treeViewFilter.nodes.Cast());
foreach(节点中的var treeNode)
{
删除未选择的节点(treeNode);
}
}
私有void DeleteUnselectedNodes(TreeNode节点)
{
var nodes=新列表(node.nodes.Cast());
foreach(节点中的var treeNode)
{
删除未选择的节点(treeNode);
}
如果(!node.Checked)
{
var parent=node.parent;
if(parent!=null)//如果它不是根
{
parent.Nodes.Remove(节点);
}
其他的
{
treeViewFilter.Nodes.Remove(节点);
}
}
}

您的循环不会检查任何子节点。递归函数或堆栈可以工作:

var nodes = new Stack<TreeNode>(treeViewFilter.Nodes.Cast<TreeNode>());
while (nodes.Count > 0) {
  var n = nodes.Pop();
  if (!n.Checked) {
    if (n.Parent != null) {
      n.Parent.Nodes.Remove(n);
    } else {
      treeViewFilter.Nodes.Remove(n);
    }
  } else {
    foreach (TreeNode tn in n.Nodes) {
      nodes.Push(tn);
    }
  }
}
var nodes=新堆栈(treeViewFilter.nodes.Cast());
而(nodes.Count>0){
var n=nodes.Pop();
如果(!n.选中){
如果(n.Parent!=null){
n、 Parent.Nodes.Remove(n);
}否则{
treeViewFilter.Nodes.Remove(n);
}
}否则{
foreach(n.Nodes中的树节点tn){
节点推送(tn);
}
}
}

这不起作用。现在没有删除treeview节点。我刚刚测试过它。这不会有问题。三个节点都未选中的TreeView控件,没有子节点,您的代码将删除节点1和3,节点2仍然存在。@LarsTech,这是真的,谢谢。我更新了答案。。。尝试选中一个父节点,取消选中两个子节点。它只删除一个子节点。