Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 13

Проверка узлов TreeView на уже существующие имена

15.04.2015, 12:01. Показов 3813. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Имеется программно созданный Treeview. Для организации дерева беру данных из БД. В БД пути папок хранятся в таком виде - "папка1\вложенная папка2\вложенная папка н". Из базы беру поочередно каждый такой путь, разбиваю по "\" символу и из полученного массива делаю узлы дерева.
Проблема вот в чем. В результате проделанного, я получаю дерево примерно такого вида:
= Один
... = Два
... = Три
= Один
... = Два
...... = Шесть
... = Четыре
...... = Пять
То есть, у меня происходит дублирование папок(узлов) с одним и тем же именем. Одни и те же пути папок создаются как разные, отдельно друг от друга. А нужен такой результат:
= Один
... = Два
...... = Шесть
... = Три
... = Четыре
...... = Пять

Создание и заполнение узлами treeview происходит так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
private void St_BTN_Click(object sender, EventArgs e)
        {
            TreeView tree = new TreeView();
            tree.Parent = this.P_DocsTree;
            tree.Dock = DockStyle.Fill;
            tree.BorderStyle = BorderStyle.None;
            tree.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular,
                System.Drawing.GraphicsUnit.Point, ((byte)(204)));
            TreeNode nodeDrive = new TreeNode("St:\\");
            tree.Nodes.Add(nodeDrive);
            nodeDrive.Expand();
            tree.ImageList = imgL_TreeView;
            AddDirectories(nodeDrive);
        }
 
private void AddDirectories(TreeNode node)
        {
            try
            {
                TreeNode node_copy = new TreeNode();
                node_copy = node;
 
                string FullPath = "";
                string sql1 = "select Path from folder_tbl where type = '1'";
                DataTable dtTree = new DataTable();
                MySql.Data.MySqlClient.MySqlDataAdapter Adapt = new MySql.Data.MySqlClient.MySqlDataAdapter(sql1, Program.connect);
 
                Adapt.Fill(dtTree);
                Adapt.Dispose();
 
                foreach (DataRow dta in dtTree.Rows)
                {
                    FullPath = dta["Path"].ToString();
 
                    if (FullPath != "")
                    {
                        string[] mass = FullPath.Split('\\');
 
                        for (int i = 0; i <= mass.Length - 1; i++)
                        {
                            TreeNode nodeDir = new TreeNode(mass[i]);
                            node.Nodes.Add(nodeDir);
                            node = nodeDir;
                        }
                        node = node_copy;
                    }
                    else
                    {
                        return;
                    }
                }
            }
            catch
            {
                MessageBox.Show("Ой, ой...");
            }
        }
Буду весьма признателен за любую подсказку.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.04.2015, 12:01
Ответы с готовыми решениями:

XML+TreeView - имена узлов
Здравствуйте! Делаю xml-редактор, за основу взял исходник вот из этой статьи:...

Как правильно удалять и изменять уже существующие данные?
И снова Здравствуйте. Столкнулся со следующей проблемой: Есть некая база данных в которой имеются номера телефонов. На одного, скажем...

Как можно записывать в существующие файл, в котором уже есть информация?
#include &lt;cstdlib&gt; #include &lt;cstdio&gt; #include &lt;fstream&gt; #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;cstdlib&gt; int View(int...

8
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
15.04.2015, 12:17
Пробуйте использовать
C#
1
public TreeNode[] Find(string key, bool searchAllChildren)
Добавлено через 5 минут
Соотвественно перед добавлением вызывать проверку, что-то вроде
C#
1
2
3
4
5
6
7
8
if (tree.Nodes[0].Nodes.Find(key, false).Length == 0)
            {
                //добавлять
            }
            else
            {
                //не добавлять
            }
0
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 13
15.04.2015, 12:34  [ТС]
lvlkoo, спасибо за ответ.
С Find была попытка разобраться, но безуспешно.
Вашей проверкой так же попробовал, хоть что-либо найти, не вышло. Будто оно вглубь не идет и сравнивает самый верхний узел. Вероятно я делаю, что-то не так.
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
15.04.2015, 13:01
Значит не в том узле вызывали метод.
В таком случаем попробуйте искать по всему дереву передав в метод вторым параметром true (искать среди детей)
C#
1
2
3
4
5
6
7
8
if (tree.Nodes[0].Nodes.Find(key, true).Length == 0)
            {
                //добавлять
            }
            else
            {
                //не добавлять
            }
0
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 13
15.04.2015, 13:08  [ТС]
Та же ерунда получилась. Постоянно идет по пути "Добавлять".
Я правильно понимаю - key в моем случае, это имя для поиска, то есть если судить из моего кода - mass[i] ?

Полез еще дальше в дебри -
C#
1
IList<TreeNode> nodes = new List<TreeNode>();
Из этой оперы может получиться выкрутить?
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
15.04.2015, 13:18
List тоже имеет метод Find
C#
1
if (list.Find(x => x.Name == "Name") == null)...
Добавлено через 2 минуты
И всетаки пройдитесь дебагером по точкам и посмотрите перед проверкой, что вам возвращает метод Find и что у вас на данным момент в дереве.
1
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 13
15.04.2015, 13:23  [ТС]
C#
1
...Find(key, true).Length
во всех случаях возвращает 0.
Но в то же время дерево заполняется повторными узлами. Они уже есть, но не отыскиваются..
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
15.04.2015, 13:32
Код C#
во всех случаях возвращает 0.
Но в то же время дерево заполняется повторными узлами. Они уже есть, но не отыскиваются..
Вызываете метод из корня?
0
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 13
15.04.2015, 14:05  [ТС]
Не совсем понял Вас.
Не могли бы Вы набросать методы в мой код, как это должно выглядеть и где присутствовать. Запутываюсь все больше..

Добавлено через 23 минуты
Нашел такой рекурсивный метод. Ищет так как хотел.

lvlkoo, спасибо за помощь.

C#
1
string txt = doSearch(tree.Nodes, mass[i]);
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private string doSearch(TreeNodeCollection tcoll, string text)
        {
            foreach (TreeNode n in tcoll)
            {
                if (n.Text == text)
                {
                    return text;
                }
                if (n.Nodes.Count != 0)
                    doSearch(n.Nodes, text);
            }
            return "";
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.04.2015, 14:05
Помогаю со студенческими работами здесь

Как записывать на новую строку в файл, что бы не удалялись уже существующие строки?
Не подскажите как мне записывать на новую строку в файл, что бы не удалялись уже существующие строки.Перепробовал все. Private Sub...

Скрытие узлов Treeview
Доброго времени суток уважаемые пользователи... На данный момент имеется задача скрыть лишние узлы дерева в TreeView которые загружаются...

Добавление узлов treeview
на форме лежит treeview, spinEdit и баттон. В SpinEdit вводится уровень вложенности дерева. Помогите написать процедуру создания...

Добавление узлов в TreeView
Долго и честно бьюсь - не доходит! Почему так работает: Set objNode = .Add(, , 'Продукты', 'Продукты') Set objNode = .Add(, ,...

Название узлов в treeview
В общем..последний символ в названии корневого узла не отображается, либо не полностью отображается. Хз почему.. :cry: среда - vs 2015...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru