通过文本选择TreeView节点

时间:2019-02-27 01:37:18

标签: c# treeview

我有一个TreeView,在其中我得到如下节点:

TreeNode tn = parent.Nodes[indexProject].Nodes[currDesign].Nodes

这是来自旧项目的遗留数据,因此我知道索引对于树视图而言是不好的做法。

我想知道的是,是否有任何方法可以通过Text选择节点,我的意思是,上面的代码在最后一个节点中返回了类似的内容:

enter image description here

所以我想让在文本字段中包含FBOM的Node可以执行以下操作:

TreeNode tn = parent.Nodes[indexProject].Nodes[currDesign].Nodes.where(x => x.Text.Contains("FOB"))

我也尝试:

 TreeNode tn = (TreeNode)parent.Nodes[indexProject].Nodes[currDesign].Nodes.Cast<TreeNode>()
                                    .Where(r => r.Text.Contains("FBOM"));

但是我得到了

  

System.InvalidCastException:'无法转换类型的对象   输入“ WhereEnumerableIterator`1 [System.Windows.Forms.TreeNode]”   “ System.Windows.Forms.TreeNode”。

1 个答案:

答案 0 :(得分:0)

如果树视图不是直接的子视图,则可能需要将其展平。例如,

 var result = treeView1.FlattenTree().Cast<TreeNode>()
                                    .Where(r => r.Text == "Node3");

其中FlattenTree被定义为。

public static class Extensions
{
    public static IEnumerable<TreeNode> FlattenTree(this TreeView source)
    {
        return FlattenTree(source.Nodes);
    }

    public static IEnumerable<TreeNode> FlattenTree(this TreeNodeCollection source)
    {
        return source.Cast<TreeNode>().Concat(source.Cast<TreeNode>().SelectMany(x => FlattenTree(x.Nodes)));
    }
}

考虑到可能有重复的节点具有相同的文本,因此在上面返回了一个集合。不过,您可以更改linq以适合您的要求。