表示メンバーが重複する可能性があるツリービューがありますが、タグは重複しません。例:
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<TreeNode>()
.FirstOrDefault(node=>node.Tag.Equals(itemID));
[〜#〜] note [〜#〜]: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;
}
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);
これはそれを処理するためのよりクリーンな方法だと思います。
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;
}
@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;
}