Intereting Posts
События автоматизации пользовательского интерфейса перестают приниматься после мониторинга приложения и затем перезапускаются через некоторое время Как сериализовать / десериализовать объект, загруженный из другой сборки? Как создать IDirect3DSurface из массива IBuffer или байтов в UWP Entity Framework Include () строго типизирован Выполняет ли Task.ContinueПохват контекста вызывающего streamа для продолжения? код автоформата из командной строки Пропустить дополнительные ViewData для строго типизированного частичного просмотра Наилучшая реализация для метода isNumber (string) Как настроить Simple Injector для запуска фоновых streamов в ASP.NET MVC Макс. Степень параллелизма для AsParallel () Не удается войти в метод, возвращающий IEnumerable ? Удаление символа из моего строкового редактора Каков наилучший способ хранения данных XML в файле Excel C # получение всех цветов от цвета Справка по проекту Euler Question 3

Winform Treeview найти узел по тегу

У меня есть древовидная структура, где элемент отображения может иметь дубликаты, а тег не будет. Пример:

TreeNode node = new TreeNode(itemName); node.Tag = itemID; //unique ID for the item treeView1.Nodes.Add(node); 

Поэтому, когда я ищу, я знаю, что могу искать по элементу itemName, используя

 treeView1.Nodes.Find(itemName, true); 

Но как я могу искать поиск по тегу? Нет определения для treeView1.Nodes.Where, поэтому нет linq для меня 🙁

Любые предложения по поиску по тегу? 🙂 Спасибо!

Попробуй это:

 var result = treeView1.Nodes.OfType() .FirstOrDefault(node=>node.Tag.Equals(itemID)); 

ПРИМЕЧАНИЕ . Поскольку вы сказали, что ваш itemID уникален, вы можете использовать FirstOrDefault для поиска уникального элемента. Если он не найден, result будет null .

ОБНОВИТЬ

Для поиска всех узлов на всех уровнях вы можете попробовать использовать какой-то рекурсивный метод, например:

 public TreeNode FromID(string itemId, TreeNode rootNode){ foreach(TreeNode node in rootNode.Nodes){ if(node.Tag.Equals(itemId)) return node; TreeNode next = FromID(itemId, node); if(next != null) return next; } return null; } //Usage TreeNode itemNode = null; foreach(TreeNode node in treeView1.Nodes){ itemNode = FromID(itemId, node); if(itemNode != null) break; } 
  public TreeNode GetNode(string name, TreeNode rootNode) { foreach (TreeNode node in rootNode.Nodes) { if (node.Name.Equals(name)) return node; TreeNode next = GetNode(name, node); if (next != null) return next; } return null; } public TreeNode GetNode(string name) { TreeNode itemNode = null; foreach (TreeNode node in treeViewPermission.Nodes) { if (node.Name.Equals(name)) return node; itemNode = GetNode(name, node); if (itemNode != null) break; } return itemNode; } 

Свойство Name, вероятно, лучший ответ для этого. http://msdn.microsoft.com/en-us/library/system.windows.forms.treenode.name(v=vs.110).aspx

 var itemNode = new TreeNode(itemName); itemNode.Name = itemID.ToString(); treeView1.Nodes.Add(node); var insertedNode = treeView1.Nodes.Find(itemID.ToString(), true); 

Я бы сказал, что это гораздо более чистый способ справиться с этим.

По версии тега @ Hamix’s

  public TreeNode GetNode(object tag, TreeNode rootNode) { foreach (TreeNode node in rootNode.Nodes) { if (node.Tag.Equals(tag)) return node; //recursion var next = GetNode(tag, node); if (next != null) return next; } return null; } public TreeNode GetNode(object tag) { TreeNode itemNode = null; foreach (TreeNode node in _sourceTreeView.Nodes) { if (node.Tag.Equals(tag)) return node; itemNode = GetNode(tag, node); if (itemNode != null) break; } return itemNode; }