我有一个TreeView,在其中我得到如下节点:
TreeNode tn = parent.Nodes[indexProject].Nodes[currDesign].Nodes
这是来自旧项目的遗留数据,因此我知道索引对于树视图而言是不好的做法。
我想知道的是,是否有任何方法可以通过Text
选择节点,我的意思是,上面的代码在最后一个节点中返回了类似的内容:
所以我想让在文本字段中包含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”。
答案 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以适合您的要求。