【问题标题】:How to Check or Uncheck All Child Nodes in TreeView如何选中或取消选中 TreeView 中的所有子节点
【发布时间】:2016-01-21 10:35:18
【问题描述】:

我的应用程序中有一个取消选择按钮,但它不能正常工作。如果我要取消选择文件夹,它将取消选择。但子文件夹中的文件夹将保持选中(选中)。

任何有关此问题的帮助将不胜感激。

【问题讨论】:

  • 您能否展示相关代码(甚至是屏幕主机)并更清楚地了解您想要实现的目标(选择/检查)?
  • @RenéVogt 查看屏幕截图...子节点保持选中状态!

标签: c# winforms tree treeview


【解决方案1】:

您应该找到包括后代在内的所有节点,然后设置Checked=false

例如,您可以使用此扩展方法来获取树的所有后代节点或节点的后代:

using System.Linq;
using System.Windows.Forms;
using System.Collections.Generic;

public static class Extensions
{
    public static List<TreeNode> Descendants(this TreeView tree)
    {
        var nodes = tree.Nodes.Cast<TreeNode>();
        return nodes.SelectMany(x => x.Descendants()).Concat(nodes).ToList();
    }

    public static List<TreeNode> Descendants(this TreeNode node)
    {
        var nodes = node.Nodes.Cast<TreeNode>().ToList();
        return nodes.SelectMany(x => Descendants(x)).Concat(nodes).ToList();
    }
}

然后你可以在树或节点上使用上述方法取消选中树的所有后代节点或取消选中节点的所有后代节点:

取消选中树的后代节点:

this.treeView1.Descendants().Where(x => x.Checked).ToList()
              .ForEach(x => { x.Checked = false; });

取消选中节点的后代节点:

例如对于节点 0:

this.treeView1.Nodes[0].Descendants().Where(x => x.Checked).ToList()
              .ForEach(x => { x.Checked = false; });

别忘了加using System.Linq;

【讨论】:

  • 兄弟...checked=false,我已经这样做了,问题是主文件夹将被取消选择,但子文件夹应保持选中状态,
  • 您说如果我要取消选择文件夹,它将取消选择。但是子文件夹中的文件夹将保持选中状态(选中)。您希望子节点选中还是取消选中?
  • 当我要取消选择按钮时,我想同时取消选择所有节点+子节点!
  • 看来您没有仔细阅读答案。添加那些使您能够获取树的所有节点或节点的所有节点的扩展方法,然后取消选中全部主题。
  • 所以答案是正是您所需要的。你的答案有什么问题?
猜你喜欢
  • 2013-01-19
  • 2012-06-16
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
相关资源
最近更新 更多