Поиск по категории
Поиск по Tag
полезно особенно когда Tag
содержит сложный объект или вы хотите найти на основе нестрочного ключа.
Для поиска на дочерних узлах вы можете посмотреть answer here и использовать метод расширения Descendants
, чтобы найти все узлы, включая дочерние узлы. Затем вы можете найти узел на Tag
. Например, если Tag
содержит Product
, и вы хотите, чтобы найти продукт, основанный на его Id
, вы можете использовать такой код:
var result = tree.Descendants().Where(x=>((x.Tag as Product) != null) &&
(x.Tag as Product).Id = someId).FirstOrDefault();
Или простой строки поиска ключа:
var result = tree.Descendants().Where(x=>(x.Tag as string) == searchkey).FirstOrDefault();
if(result!=null)
tree.SelectedNode = result;
Если у вас для поиска только между корневыми узлами, используйте:
var result = tree.Nodes.Cast<TreeNode>().Where(... the rest is like above.
поиск по названию
Вы можете использовать метод Find
коллекции Nodes
, чтобы найти узел на основе его Name
(а не текста). Использование метода Find
полезно, когда вы хотите найти узел на основе строкового ключа. Для этого вы должны установить Name
узла при создании узла.
var result = tree.Nodes.Find(searchKey , true).FirstOrDefault();
if(result !=null)
tree.SelectedNode = result;
Если вы хотите искать только между корневыми узлами, используйте:
var result = tree.Nodes.Find(searchKey , false).FirstOrDefault();
Примечание
В заключение вы можете использовать Tag
свойство хранить сложный объект в Tag
и распакуйте его, когда вам нужно. Для строковых ключей поиска лучше использовать свойство Name
, как указано в comments.
Используйте ключи при создании узлов. Если они уникальны, вы сможете выбрать ключ. – Alex
Свойство Tag бесполезно, вместо этого используйте свойство TreeNode.Name. Не нужно возвращаться, чтобы найти его обратно, он загорается методом ContainsKey() и индексом, как и планировалось. Бедные имена btw, они должны были бы назвать его TreeNode.Key вместо этого. –