В данной статье рассмотрим создание поиска в древовидной структуре элемента управления «TreeView».
Создайте проект «Windows Form» в «Microsoft Visual Studio» и добавьте на главную форму вашего проекта следующие элементы управления:
Для заполнения элемента управления «TreeView» данными, воспользуемся статьей «Представление любого каталога в виде древовидной структуры с использованием элемента управления «TreeView»» и выполним все пункты этой статьи:
1) Сделайте двойной клик левой клавишей мыши по любому свободному месту главной формы, вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «Form1_Load», события «Load», выполняющегося при загрузке формы. Вставьте в тело данного метода приведенный ниже листинг.
Если совпадения будут найдены, данные узлы будут подсвечены зеленым цветом.
Для отмены поиска и очистки фона найденных элементов, нажмите кнопку «Отмена».
Создайте проект «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». После успешной компиляции и запуска вашего проекта у вас откроется диалоговое окно выбора директории для сканирования и вывода структуры выбранного каталога в виде древовидной структуры. Введите в текстовое поле поиска текст который вы хотите найти и нажмите кнопку запуска процесса поиска.Если совпадения будут найдены, данные узлы будут подсвечены зеленым цветом.
Для отмены поиска и очистки фона найденных элементов, нажмите кнопку «Отмена».
Ссылка для скачивания примера: Яндекс.Диск







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