
- •Урок 7. Работаем с xml-файлом
- •Урок 10. Класс SystemInformation
- •Урок 13. Получаем список всех установленных шрифтов
- •Урок 15. Продолжаем работать с TreeView
- •Урок 17. Применяем стили xp
- •Урок 18. TreeView - показываем каталоги
- •Урок 19. TreeView для каталогов - продолжение
- •Урок 26.Передаем данные из диалога
Урок 15. Продолжаем работать с TreeView
На этом уроке мы с вами посмотрим, как можно найти узел по его тексту.
Добавьте на форму программы, написанной на прошлом уроке, еще одну кнопку и тествое поле. Для кнопки задайте значение свойст Name и Text на find и Find соответственно, для тествого поля эти же свойства установите в findNode и пустую строку.
Теперь в обработчике нажатия на кнопку вставьте следующий код:
// Выделение узла по названию.
private void find_Click(object sender, System.EventArgs e)
{
// Снимаем выделение с дерева.
treeView1.SelectedNode = null;
// Ищем узел с определенным текстом.
TreeNode tn = FindNode(treeView1, findNode.Text);
// Если нашли,
if(tn!=null)
{
// то выделяем.
treeView1.SelectedNode = tn;
treeView1.Focus();
}
}
Как вы видите, тут мы используем метод FindNode, который ищет узел по его названию. Это наш метод, который мы еще не написали. Исправим это. Добавьте этот метод в класс формы:
// Поиск узла в дереве по названию.
private TreeNode FindNode(TreeView tv, string name)
{
// Ищем в узлах первого уровня.
foreach(TreeNode tn in tv.Nodes)
{
// Если нашли,
if(tn.Text==name)
{
// то возвращаем.
return tn;
}
}
// Ищем в подузлах.
TreeNode node;
foreach(TreeNode tn in tv.Nodes)
{
// Делаем поиск в узлах.
node = FindNode(tn, name);
// Если нашли,
if(node!=null)
{
// то возвращаем.
return node;
}
}
// Ничего не нашли.
return null;
}
Принцип действия метода FindNode такой - сначала просматриваем узлы верхнего уровня (корневые). Если нашли нужный узел, то его и возвращаем. Если не нашли узел среди корневых узлов, то просматриваем их еще раз - но на этот раз для каждого корневого узла вызываем метод FindNode (обратите внимание, что у него первым параметром идет не само дерево, а узел дерева), который ищет узел с заданным именем у конкретного узла дерева. Этот метод нам также предстоит написать - но уже на следующем уроке.
Урок 16. TreeView - окончание
С прошлого урока нам осталось написать метод FindNode, который ищет узел с определенным названием, принадлежащий некоторому подузлу.
Вот текст этого метода:
// Поиск подузла в узле по названию.
private TreeNode FindNode(TreeNode treenode, string name)
{
// Ищем в узлах первого уровня.
foreach(TreeNode tn in treenode.Nodes)
{
// Если нашли,
if(tn.Text==name)
{
// то возвращаем.
return tn;
}
}
// Ищем в подузлах.
TreeNode node;
foreach(TreeNode tn in treenode.Nodes)
{
// Делаем поиск в узлах.
node = FindNode(tn, name);
// Если нашли,
if(node!=null)
{
// то возвращаем.
return node;
}
}
// Ничего не нашли.
return null;
}
Этот метод - рекурсивный. Т. е. он вызывает сам себя - и это логично - сначала нужный подузел ищется среди подузлов только первого уровня. Если не нашли, то рекурсивно вызываем этот же метод для поиска в каждом подузле нашего узла. Если и там ничего не нашли, то возврящем null.
Запускаем программу. Если узел с искомым именем существует (а имя надо вводить, естественно, во второе текстовое поле), то он выделится в дереве: