web-dev-qa-db-ja.com

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はありません:(

タグで検索する方法に関する提案はありますか? :) ありがとうございました!

12
user1548103

これを試して:

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

[〜#〜] note [〜#〜]itemIDは一意であると言ったので、FirstOrDefaultを使用して一意のアイテムを検索できます。見つからない場合、resultnullになります。

更新

すべてのレベルですべてのノードを検索するには、次のような再帰的な方法を使用してみます。

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

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

これはそれを処理するためのよりクリーンな方法だと思います。

1
Richard June
    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;
    }
1
Hamix

@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;
        }
0
wchoward