7 / 7 / 8
Регистрация: 11.04.2012
Сообщений: 87
1

Прорисовка treeView из БД

02.11.2012, 07:41. Показов 10059. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
У меня задание с иерархиями.

Создаю таблицу с такими полями:
ID | CODE | NAME
где, ID - уникальный номер, CODE - код номенклатуры, NAME - название номенклатуры

CODE должен иметь примерно такой формат:
xx.yy.zz
где, xx - деятельность, yy - договор, zz - задача

В БД будет храниться так:
1 | 01 | Основная деятельность
2 | 01.01 | Договор об открытии и порядке ведения корреспондентсткого счета
3 | 01.02 | Договор по межбанковским кредитам
4 | 02 | Хозяйственная деятельность
5 | 02.02 | Договор коммунальный
6 | 02.02.01 | Электроснабжение
7 | 02.02.02 | Теплоснабжение
Так же надо учесть то, что уровни иерархии могут расширяться. Так что их может не 3. А даже и так: xx.yy.zz.uu.hh.qq

Добавлю Я данные в БД (пока без добавления новых), как создать универсальный алгоритм, чтобы 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
RadTreeNode root = new RadTreeNode();
 
using (conn = new MySqlConnection(Properties.Settings.Default.ConnectionString))
    {
    try
    {
        conn.Open();                    
        using (cmd = new MySqlCommand("SELECT Code, Name FROM Nomenclature", conn))
        {
            using (dr = cmd.ExecuteReader())
            {
                while (dr.Read())
                {
                    //Если это корневой каталог
                    root = this.treeView.Nodes.Add(dr.GetString(0));
                    //Если 01.01 и тп, то это подкаталог
                    root.Nodes.Add("Договор..");
                    //Если это кодкаталог 01 и у него еще есть каталоги, то
                    RadTreeNode com = root.Nodes.Add("Договор коммунальный");
                    и его подкаталог
                    com.Nodes.Add("электроснабжение", 1);
                    //Прорисовка
                }
            }
        }                    
    }
    catch (MySqlException e)
    {
        MessageBox.Show(e.Message);
        throw;
    }
    }
Миниатюры
Прорисовка treeView из БД  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2012, 07:41
Ответы с готовыми решениями:

Treeview Drag'n'Drop прорисовка ветви с её дочерними элиментами
Добрый вечер господа!, Ищу ответ на мой вопрос, не получается прорисовать всю ветку и её дочерние...

Как присвоить серверному контроллу TreeView коллекцию из TreeView, в котором находится информация из БД
Здравствуйте, в общем я кидаю на страницу TreeView и хочу его динамически заполнять, но сразу куча...

Прорисовка
есть такая функцияф в делфи Application.ProcessMessages Подскажите аналог в шарпе.

прорисовка кнопок
когда сворачиваю - разворачиваю приложение то кнопки пропадают и лишь проведя по ним мышкой они...

18
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
02.11.2012, 22:52 2
Лучший ответ Сообщение было отмечено kolorotur как решение

Решение

Добрый вечер.
Перво-наперво, я бы немного изменил структуру вашей таблицы, добавив еще одно поле ParentID, которое будет ссылаться на эту же таблицу, на поле ID.
Таким образом вы значительно улучшите иерархическую систему, да и глубина вложенности не будет зависеть от размера поля CODE.
В поле CODE же хранить только код непосредственно данной номенклатуры - без учета родительского кода.
То есть предложенная вами таблица с предложенными мной изменениями будет выглядеть так:

ID ParentID Code Name
1NULL01 Основная деятельность
2 1 01 Договор об открытии и порядке ведения корреспондентсткого счета
3 102 Договор по межбанковским кредитам
4 NULL 02 Хозяйственная деятельность
5 4 01 Договор коммунальный
6 5 01 Электроснабжение
7 5 02 Теплоснабжение

После чего код обработки таблицы будет выглядеть примерно так (долго с красотой не заморачивался, потому сделал тупо через Dictionary):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using (var cmd = new SqlCommand("SELECT ID, ParentID, Code, Name FROM Nomenclature ORDER BY ParentID ASC, Code ASC", conn)) {
    using (var dr = cmd.ExecuteReader()) {
        var nodes = new Dictionary<int, TreeNode>();
        while (dr.Read()) {
            int id = dr.GetInt32(0);
            int? parentId = dr.IsDBNull(1) ? null : (int?)dr.GetInt32(1);
            string code = dr.GetString(2);
            string name = dr.GetString(3);
 
            var node = new TreeNode(name);
            TreeNode parent;
            if (parentId == null)
                tree.Nodes.Add(node); // Добавление ноды в контрол TreeView
            else if (nodes.TryGetValue(parentId.Value, out parent))
                parent.Nodes.Add(node);
            nodes.Add(id, node);
        }
    }
}
5
7 / 7 / 8
Регистрация: 11.04.2012
Сообщений: 87
03.11.2012, 17:00  [ТС] 3
Хммм, отлично.
Я бы 5 плюсов поставил, но нельзя так.)
0
49 / 40 / 37
Регистрация: 25.07.2013
Сообщений: 178
25.08.2014, 16:20 4
kolorotur, объясните, пожалуйста, еще раз, для чего нужен столбец "Code" в данном примере?
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
25.08.2014, 20:44 5
Цитата Сообщение от quakeer Посмотреть сообщение
объясните, пожалуйста, еще раз, для чего нужен столбец "Code" в данном примере?
Для хранения кода номенклатуры, который стоит перед наименованием в документах.
Например из таблицы:

01 Основная деятельность
01 Договор об открытии и порядке ведения корреспондентсткого счета
02 Договор по межбанковским кредитам
02 Хозяйственная деятельность
01 Договор коммунальный
01 Электроснабжение
02 Теплоснабжение
Имея отдельную колонку под код номенклатуры, можно с легкостью изменять порядок элементов. Скажем, если надо в документе поменять местами "Электроснабжение" и "Теплоснабжение", то достаточно в таблице поменять значения их кода.
2
2 / 2 / 1
Регистрация: 30.01.2014
Сообщений: 263
28.11.2015, 18:51 6
у Вас есть исходник программы????
0
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 10
14.07.2016, 12:36 7
У меня проблема с отображением дерево, сможете помочь ?
0
49 / 40 / 37
Регистрация: 25.07.2013
Сообщений: 178
14.07.2016, 13:25 8
думаю, сразу стоит написать в чем проблема, а не ждать, пока вас спросят)
0
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 10
14.07.2016, 13:30 9
quakeer, У меня сложности с деревьями. Пробовал два способа. Первый способ я через ADO подключился. И поднял дерево он отобразил дерево с вьюшки. А с таблицы я не смог. Так как в одной таблице собирается дерево, а имя в другой таблице. Я их тупо объединил.

Код прилагаю.

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
58
59
60
61
62
63
64
65
66
67
68
69
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data;
 
namespace GMDNTEST
{
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
 
PopulateMenu();
}
}
 
private void PopulateMenu()
{
List<View_Tree> allMenu = new List<View_Tree>();
using (GMDNEntities12 dc = new GMDNEntities12())
{
allMenu = dc.View_Tree.ToList();
}
// Call function here for bind treeview
CreateTreeView(allMenu, 0, null);
}
 
private void CreateTreeView(List<View_Tree> source, int parentID, TreeNode parentNode)
{
 
 
 
List<View_Tree> newSource = source.Where(a => a.parentnodeID.Equals(parentID)).ToList();
foreach (var i in newSource)
{
TreeNode newnode = new TreeNode(i.name.ToString(), i.cttreenodeID.ToString());
if (parentNode == null)
{
tvMenu.Nodes.Add(newnode);
}
else
{
parentNode.ChildNodes.Add(newnode);
}
CreateTreeView(source, i.cttreenodeID, newnode);
}
}
 
protected void btnSubmit_Click(object sender, EventArgs e)
{
List<View_Tree2> checkedMenu = new List<View_Tree2>();
foreach (TreeNode i in tvMenu.CheckedNodes)
{
checkedMenu.Add(new View_Tree2 { termCode = Convert.ToInt32(i.Value), nmirkCode = Convert.ToInt32(i.Value), termName_rus = i.Text, termDefinition_rus = i.Text });
}
 
GridView1.DataSource = checkedMenu;
GridView1.DataBind();
}
 
}
}
Миниатюры
Прорисовка treeView из БД  
0
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 12
21.03.2018, 22:49 10
Цитата Сообщение от kolorotur Посмотреть сообщение
using (var cmd = new SqlCommand("SELECT ID, ParentID, Code, Name FROM Nomenclature ORDER BY ParentID ASC, Code ASC", conn)) {
Можно подробнее расписать что указывается в переменной "conn"?
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
22.03.2018, 01:08 11
Цитата Сообщение от Alex1988S Посмотреть сообщение
что указывается в переменной "conn"
Ссылка на SqlConnection — соединение с базой.
0
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 12
22.03.2018, 22:13 12
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using (var cmd = new SqlCommand("SELECT ID, ParentID, Code, Name FROM Nomenclature ORDER BY ParentID ASC, Code ASC", conn)) {
    using (var dr = cmd.ExecuteReader()) {
        var nodes = new Dictionary<int, TreeNode>();
        while (dr.Read()) {
            int id = dr.GetInt32(0);
            int? parentId = dr.IsDBNull(1) ? null : (int?)dr.GetInt32(1);
            string code = dr.GetString(2);
            string name = dr.GetString(3);
 
            var node = new TreeNode(name);
            TreeNode parent;
            if (parentId == null)
                tree.Nodes.Add(node); // Добавление ноды в контрол TreeView
            else if (nodes.TryGetValue(parentId.Value, out parent))
                parent.Nodes.Add(node);
            nodes.Add(id, node);
        }
    }
}
Ещё вопрос: где в этом коде узел parent добавляется в tree?
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
22.03.2018, 22:21 13
Alex1988S, 13-я строка
0
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 12
22.03.2018, 22:28 14
Цитата Сообщение от kolorotur Посмотреть сообщение
Alex1988S, 13-я строка
Спасибо за быстрый ответ, однако TreeView и TreeNode никак мне не даются.
Я понимаю в 15ой строчке добавляем добавляем ноды в parent, в 13ой строчке мы добавляем node, а где добавлялся этот самый parent я не вижу ((( ведь нет в коде
C#
1
tree.Node.Add(parent)
Заранее извиняюсь за может быть глупый вопрос
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
22.03.2018, 22:36 15
Alex1988S, записи, у которых нет родительской категории, добавляются в 13-й строке в дерево как корневые.
Все элементы добавляются в локальный словарь по ключу в 16-й строке. Если в словаре есть элемент с ключем, равным родительской категории текущего элемента (14-я строка), то он добавляется в созданный ранее родитель в 15-й строке.
0
1842 / 1184 / 501
Регистрация: 14.10.2018
Сообщений: 3,180
01.11.2018, 20:16 16
За логику с дополнительным ID спасибо, сам долго думал как реализовать примерный алгоритм, однако могу заметить что тут похоже без рекурсии не обойтись ибо возникает одна проблема а именно:
1
1.1
1.1.1
1.1.1.1
1.1.1.1.1
Поля что выделены красным не попадают в TreeView.
Будем учить нелюбимую всеми тему.
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
02.11.2018, 10:09 17
Цитата Сообщение от Enifan Посмотреть сообщение
тут похоже без рекурсии не обойтись
Без рекурсии всегда можно обойтись
Судите сами: ваш процессор — итеративная машина Тьюринга, однако он может выполнять любые рекурсивные алгоритмы.
Значит любой рекурсивный алгоритм может быть изменен на итеративный.

Цитата Сообщение от Enifan Посмотреть сообщение
Поля что выделены красным не попадают в TreeView.
Посмотреть бы на код заполнения и считывания — готов поспорить, что баг где-то там.
1
1842 / 1184 / 501
Регистрация: 14.10.2018
Сообщений: 3,180
02.11.2018, 16:36 18
Цитата Сообщение от kolorotur Посмотреть сообщение
готов поспорить, что баг где-то там
Ваша правда. Ваш код работает на 5+, я не сразу понял для чего нужен столбец Code, именно из за него у меня и были проблемы. Сейчас все решил.
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
02.11.2018, 17:40 19
Цитата Сообщение от Enifan Посмотреть сообщение
Ваш код работает на 5+
Алгоритм выше рассчитывает на то, что ID родителя всегда будет меньше ID вложенного элемента.
Если приложение предусматривает изменение иерархии и может оказаться так, что дочерний элемент станет родителем своего теперь уже бывшего родителя, то будут проблемы.
Устраняется элементарно, но имейте это в виду.
0
02.11.2018, 17:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2018, 17:40
Помогаю со студенческими работами здесь

Прорисовка в D3D
Создаю модели в Cinema 4D, экспортируя их в DX столкнулся с такими проблемами: 1. Модель которая в...

Прорисовка DataGridView
Всем провер, столкнулся с такой проблемой, если загрузить из базы в DataGridView сроки в...

Прорисовка WinAPI
почему неправильно прорисовываются кнопки (Edite_Down_Button). Вот архив с проектом написан на...

Прорисовка траектории
Мне нужно справиться с такой вот задачкой: Из точки , координаты которой xa ya, прямолинейно и...

Прорисовка фигуры
при указании координат нужно проверить расположение введенной точки не попала ли она на фигуру(в...

Прорисовка полигона
Здравствуйте! Я хочу нарисовать полигон некоторой толщины, а потом залить его. ...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru