Поиск в TreeView

      В данной статье рассмотрим создание поиска в древовидной структуре элемента управления «TreeView».
      Создайте проект «Windows Form» в «Microsoft Visual Studio» и добавьте на главную форму вашего проекта следующие элементы управления:
  • «TreeView 1» 
  • «TextBox 1» - поле для ввода текста;
  • «Button 1» - кнопка поиска;
  • «Button 2» - кнопка отмены поиска.
У вас получится приведенный ниже пример.
      Для заполнения элемента управления «TreeView» данными, воспользуемся статьей «Представление любого каталога в виде древовидной структуры с использованием элемента управления «TreeView»» и выполним все пункты этой статьи:
1) Сделайте двойной клик левой клавишей мыши по любому свободному месту главной формы, вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «Form1_Load», события «Load», выполняющегося при загрузке формы. Вставьте в тело данного метода приведенный ниже листинг.

//Создание класса для вывода окна выбора директории
FolderBrowserDialog fbd = new FolderBrowserDialog(); 

//Выводим диалоговое окно для выбора директории.
// Данный класс возвращает следующие значения:
// 1) Объект System.Windows.Forms.DialogResult.OK, 
//    если пользователь нажимает кнопку 
//    ОК в диалоговом окне;
// 2) Объект System.Windows.Forms.DialogResult.Cancel,  
//    если пользователь закрывает диалоговое окно.
DialogResult result = fbd.ShowDialog();

//Если пользователь выбрал директорию
//и нажал ОК, то запускаем процесс сканирования
if (result == DialogResult.OK)
{
    //Вызов метода сканирования с
    //передачей в качестве параметра, пути к  
    //выбранной директории 
    InitFolders(fbd.SelectedPath);
}
2) Добавьте приведенные ниже два метода сканирования и вывода указанной директории в элемент управления «TreeView», в листинг главной формы.
private void InitFolders(string path)
{
    //Отключаем любую перерисовку
    //иерархического представления.
    treeView1.BeginUpdate();

    //Инициализируем новую переменную предоставляющую методы экземпляра
    //класса для создания, перемещения и перечисления
    //в каталогах и подкаталогах.
    System.IO.DirectoryInfo di;
    try
    {
        //Вызываем метод GetDirectories с передачей в качестве параметра, пути к 
        //выбранной директории. Данный метод возвращает
        //массив имен подкаталогов.
        string[] root = System.IO.Directory.GetDirectories(path);

        //Проходимся по всем полученным подкаталогам.
        foreach (string s in root)
        {
            try
            {
                //Заносим в переменную информацию
                //о текущей директории.
                di = new System.IO.DirectoryInfo(s);
                //Вызов метода сканирования с
                //передачей в качестве параметра, информации
                //о текущей директории и объект 
                //System.Windows.Forms.TreeNodeCollection,
                //который предоставляет узлы
                //дерева, назначенные элементу управления 
                //иерархического представления.
                BuildTree(di, treeView1.Nodes);
            }
            catch { }
        }
    }
    catch { }
    //Разрешаем перерисовку иерархического представления.
    treeView1.EndUpdate();
}       

//Процесс получения папок и файлов
private void BuildTree(System.IO.DirectoryInfo directoryInfo, TreeNodeCollection addInMe)
{
    //Добавляем новый узел в коллекцию Nodes
    //с именем текущей директории и указанием ключа 
    //со значением "Folder".
    TreeNode curNode = addInMe.Add("Folder", directoryInfo.Name);

    //addInMe.Add(directoryInfo.FullName, directoryInfo.Name, 
    //тут можно указать номер картинки для узла из imageCollection);

    //Перебираем папки.
    foreach (System.IO.DirectoryInfo subdir in directoryInfo.GetDirectories())
    {
        //Запускам процесс получения папок и фалов 
        //с текущей найденной директории.
        BuildTree(subdir, curNode.Nodes);
    }

    //Перебираем файлы
    foreach (System.IO.FileInfo file in directoryInfo.GetFiles())
    {
        //Добавляем новый узел в коллекцию Nodes
        //С именем текущей директории и указанием ключа 
        //со значением "File".
        curNode.Nodes.Add("File", file.Name);

        //curNode.Nodes.Add("File", file.Name, 
        //тут можно указать номер картинки для узла из imageCollection);  
    }
}
      Перейдите в конструктор главной формы и сделайте двойной клик левой клавишей мыши по элементу управления «button1». Вы перейдете в редактор кода с автоматической установкой курсора в созданном методе «button1_Click», события «Click», возникающего при нажатии на кнопку. Добавьте приведенный ниже листинг в тело данного метода.
//Проверка, что поле поиска не пустое.
if (textBox1.Text.Length > 0)
{
    //Проверка, что поиск не тот же.
    if (LastSearchText != textBox1.Text)
    {
        //Очищаем переменную,
        //хранящую найденные элементы.
        CurrentNodeMatches.Clear();
        //Сохраняем текущий поиск.
        LastSearchText = textBox1.Text;
        //Запускаем метод поиска, с передачей 
        //в качестве параметров, текст для поиска и 
        //с какого элемента начинать поиск.
        SearchNodes(textBox1.Text, treeView1.Nodes[0]);
    }

    //Проверка количества найденных элементов.
    if (CurrentNodeMatches.Count > 0)
    {
        //Проходим по найденным элементам.
        for (int i = 0; i < CurrentNodeMatches.Count; i++)
        {
            //Берем текущий элемент
            TreeNode selectedNode = CurrentNodeMatches[i];
            //Задаем узел дерева, который в текущий момент будет выбран в элементе
            //управления иерархического представления.
            this.treeView1.SelectedNode = selectedNode;
            //Разворачиваем выбранный узел.
            this.treeView1.SelectedNode.Expand();
            //Задаем цвет фона для выбранного узла.
            this.treeView1.SelectedNode.BackColor = Color.FromArgb(0xCC, 0xFF, 0x00);
            //Активируем элемент управления.
            this.treeView1.Select();
        }
    }
}
Добавьте приведенный ниже метод поиска, в листинг главной формы.
//Переменная для хранения найденных элементов.
private List<TreeNode> CurrentNodeMatches = new List<TreeNode>();
//Переменная для хранения данных последнего поиска.
private string LastSearchText;

//Метод поиска, принимающий в качестве входных параметров,
//текст для поиска и узел с которого надо начинать поиск.
private void SearchNodes(string SearchText, TreeNode StartNode)
{
    while (StartNode != null)
    {
        //Проверяем значение поиска, равно ли оно данному экземпляру.
        //Если получено значение true, то параметр value встречается
        //в строке, иначе — false.
        if (StartNode.Text.ToLower().Contains(SearchText.ToLower()))
        {
            //Добавляем элемент в список найденных.
            CurrentNodeMatches.Add(StartNode);
        };

        //Если в текущем узле элементы не закончились,
        //то запускам метод поиска.
        if (StartNode.Nodes.Count != 0)
        {
            SearchNodes(SearchText, StartNode.Nodes[0]);
        };
        //Берем следующий узел для поиска.
        StartNode = StartNode.NextNode;
    };
}
      Перейдите в конструктор главной формы и сделайте двойной клик левой клавишей мыши по элементу управления «button2». Вы перейдете в редактор кода с автоматической установкой курсора в созданном методе «button2_Click», события «Click», возникающего при нажатии на кнопку. Добавьте приведенный ниже листинг очистки поиска, в тело данного метода.
//Очищаем поле поиска.
textBox1.Text = "";

//Проверяем количество найденных элементов.
if (CurrentNodeMatches.Count > 0)
{
    //Проходим по найденным элементам.
    for (int i = 0; i < CurrentNodeMatches.Count; i++)
    {
        //Берем текущий элемент.
        TreeNode selectedNode = CurrentNodeMatches[i];
        //Задаем узел дерева, который в текущий
        //момент будет выбран в элементе
        //управления иерархического представления.
        this.treeView1.SelectedNode = selectedNode;
        //Сворачиваем выбранный узел.
        this.treeView1.SelectedNode.Collapse();
        //Задаем цвет фона по умолчанию, для выбранного узла.
        this.treeView1.SelectedNode.BackColor = treeView1.BackColor;
        //Активируем элемент управления.
        this.treeView1.Select();
    }
}
      Запустите проект, нажав на клавишу «F5». После успешной компиляции и запуска вашего проекта у вас откроется диалоговое окно выбора директории для сканирования и вывода структуры выбранного каталога в виде древовидной структуры. Введите в текстовое поле поиска текст который вы хотите найти и нажмите кнопку запуска процесса поиска.
Если совпадения будут найдены, данные узлы будут подсвечены зеленым цветом.
Для отмены поиска и очистки фона найденных элементов, нажмите кнопку «Отмена».

Ссылка для скачивания примера: Яндекс.Диск


Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!