Вот так:
TreeNode[] treeNodes = treeView.Nodes.Find(searchString, true);
но я хочу, чтобы он выполнял поиск в поле text
вместо поля name
.
Вот так:
TreeNode[] treeNodes = treeView.Nodes.Find(searchString, true);
но я хочу, чтобы он выполнял поиск в поле text
вместо поля name
.
Я не знаю какого-либо встроенного метода, но вы можете использовать LINQ
TreeNode[] treeNodes = treeView.Nodes
.Cast<TreeNode>()
.Where(r => r.Text == "yourText")
.ToArray();
Чтобы искать все узлы дерева (а не только прямые дочерние узлы), вы можете использовать метод расширения ниже
var nodes = treeView1.FlattenTree()
.Where(n => n.Text == "sometext")
.ToList();
-
public static class SOExtension
{
public static IEnumerable<TreeNode> FlattenTree(this TreeView tv)
{
return FlattenTree(tv.Nodes);
}
public static IEnumerable<TreeNode> FlattenTree(this TreeNodeCollection coll)
{
return coll.Cast<TreeNode>()
.Concat(coll.Cast<TreeNode>()
.SelectMany(x => FlattenTree(x.Nodes)));
}
}
Следующий код показывает только узлы, которые соответствуют критериям поиска.
Скопируйте следующий код в событие поиска
private void tbxSearch_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
trvMenu.BeginUpdate();
if (tbxSearch.Text.Length > 0)
{
for (int i = trvMenu.Nodes.Count; i > 0 ; i--)
{
NodeFiltering(trvMenu.Nodes[i - 1], tbxSearch.Text);
}
}
trvMenu.EndUpdate();
}
Затем создайте функцию "ИЗОБРАЖЕНИЕ" и "Фильтр"
private bool NodeFiltering(TreeNode Nodo,string Texto)
{
bool resultado = false;
if (Nodo.Nodes.Count == 0)
{
if (Nodo.Text.ToUpper().Contains(Texto.ToUpper()))
{
resultado = true;
}
else
{
Nodo.Remove();
}
}
else
{
for (int i = Nodo.Nodes.Count; i > 0; i--)
{
if (NodeFiltering(Nodo.Nodes[i - 1], Texto))
resultado = true;
}
if (!resultado)
Nodo.Remove();
}
return resultado;
}
Этот код довольно хорош для создания меню Treeview со многими уровнями.
Если я правильно вас понимаю (последний вопрос был очень запутанным), вы можете написать метод поиска самостоятельно следующим образом
public static TreeNode[] Find(this TreeNode motherNode, string findNodeText)
{
List<TreeNode> nodeList = new List<TreeNode>();
foreach (TreeNode childNode in motherNode.Nodes)
if (childNode.Text.Equals(findNodeText, StringComparison.CurrentCulture))
nodeList.Add(childNode);
return nodeList.ToArray<TreeNode>();
}
Этот метод можно использовать как
TreeView myTreeView = new TreeView();
foreach (TreeNode node in myTreeView.Nodes)
{
TreeNode[] childNodes = node.Find("Text");
// Do something...
}
Надеюсь, это поможет.