2015-12-11 3 views
2

Я пытаюсь выбрать узел по тегу. Я искал, что могу, но все равно не повезло. Я использовал это, чтобы присвоить метку каждому узлу в моем treeviewКак выбрать узел по тегу в Windows Forms TreeView

foreach (DataRow dataRow in databaseFunc.dataTable.Rows) 
{ 
     TreeNode nodes = new TreeNode(); 
     nodes.Text = dataRow["LastName"].ToString().Trim() + ", " + 
      dataRow["FirstName"].ToString().Trim(); 
     nodes.Tag = dataRow[0].ToString().Trim(); 
     treeView.Nodes.Add(nodes); 
} 

Я знаю, вы можете выбрать узел с помощью:

TreeNodeCollection nodeCollect = treeView.Nodes; 
treeView.SelectedNode = nodeCollect[index]; 
+0

Используйте ключи при создании узлов. Если они уникальны, вы сможете выбрать ключ. – Alex

+0

Свойство Tag бесполезно, вместо этого используйте свойство TreeNode.Name. Не нужно возвращаться, чтобы найти его обратно, он загорается методом ContainsKey() и индексом, как и планировалось. Бедные имена btw, они должны были бы назвать его TreeNode.Key вместо этого. –

ответ

3

Поиск по категории

Поиск по 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.

Смежные вопросы