Voici une petite méthode d’extension qui permet d’effectuer une recherche de manière récursive dans un treeview en lui spécifiant un prédicat :
public static class TreeNodeExtension
{
public static IEnumerable<TreeNode> FindNodes(this TreeNodeCollection nodesCollection, Func<TreeNode, bool> predicate)
{
var nodes = nodesCollection.Cast<TreeNode>();
return nodes.SelectMany(n => FindNodes(n.Nodes, predicate).Union(nodes.Where(n2 => predicate(n2))));
}
}
Le SelectMany permet de mettre à plat l’appel récursif. Si on utilise un Select à la place du SelectMany on obtient une liste de liste de nœud. Le SelectMany est l’équivalent de 2 from comme ceci :
return from n in nodes
from child in n.Nodes
where predicate(child)
select child;
Pour l’utiliser ce n’est pas bien compliqué…
Je voudrai récupérer la liste des TreeNode de type FileNode et qui sont sélectionnés :
var checkedFilesNode = treeView1.Nodes.FindNodes(n => n is FileNode && n.Checked == true);