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

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

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 для меня: (

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

Ответ 1

Попробуйте следующее:

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

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

UPDATE

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

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;
}

Ответ 2

    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;
    }

Ответ 3

Свойство 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);

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

Ответ 4

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

        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;
        }