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

Заполнить treeview данными из трех связанных один-к-одному таблиц

23.07.2021, 08:50. Показов 964. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Перенесено из темы Заполнить treeview из таблицы базы данных хранящей дерево


Добрый день, помогите разобраться, пытаюсь заполнить 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
        private void podrazdeleniya_Load(object sender, EventArgs e)
        {
            this.выборСуперОбъектTableAdapter.Fill(this.bdsiDataSet.ВыборСуперОбъект);
            this.выборМакроОбъектTableAdapter.Fill(this.bdsiDataSet.ВыборМакроОбъект);
            this.выборОбъектTableAdapter.Fill(this.bdsiDataSet.ВыборОбъект);
 
            foreach (DataRow dr in this.bdsiDataSet.ВыборСуперОбъект.Rows)  // сначала пробежал по всем строкам главной таблицы
            {
                TreeNode node = new TreeNode();
                string n = dr["Код"].ToString();
 
                // пробегаюсь по строкам подчиненной таблицы, но только по тем, которые относятся к текущей строке главной таблицы
                foreach (DataRow r in this.bdsiDataSet.ВыборМакроОбъект.Select("Код" + n))
                {
                    node.Text = r["макрообъект"].ToString();
                    treeView1.Nodes.Add(node);
 
                    TreeNode node1 = new TreeNode();
                    node1.Name = dr["Код"].ToString();
 
                    foreach (DataRow r1 in this.bdsiDataSet.ВыборСуперОбъект.Select("Код = " + node1.Name))
                    {
                        node1.Text = r1["объект"].ToString();
                        node.Nodes.Add(node1);
 
                        foreach (DataRow q in this.bdsiDataSet.ВыборМакроОбъект.Select("Код = " + node1.Name))
                        {
                            node1.Text = q["LName"].ToString() + " " + q["FName"].ToString() + " " + q["MName"].ToString();
                            node1.Nodes.Add(node1);
                        }
                    }
 
                }
            }
        }
Во время выполнения в строчке

C#
1
                foreach (DataRow r in this.bdsiDataSet.ВыборМакроОбъект.Select("Код" + n))
Значение "Код" равно "имя поля следующей таблицы+значение" конкретно "Код26". что не так?
Буду очень признателен за помощь.
Миниатюры
Заполнить treeview данными из трех связанных один-к-одному таблиц  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.07.2021, 08:50
Ответы с готовыми решениями:

Выборка элементов из таблиц, связанных связью "один к одному"
Здравствуйте! Нужна ваша помощь по организации БД. У меня есть таблица с разного рода товарами. Например, там есть телефоны, наушники...

Заполнение данными на SQL двух связанных таблиц
Есть 2 таблицы: Объявление и Автор поля: Объявление.id, Объявление.Текст, Автор.Фамилия, Автор.Id_автора, Автор.Адрес ,где...

Запрос на выборку из трёх связанных таблиц
Кто может схематично изобразить запрос на выборку из трёх связанных таблиц? код программы чисто для примера что я делаю. void...

16
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.07.2021, 00:30
aksident, Ваш код имеет ряд существенных минусов
1. Вы "закладываетесь" на 3 уровня, соответственно три очень похожих таблицы. А что, если потребуется еще один уровень, а то и два ?
2. Ваш код жестко привязан к колонкам таблиц, что неумолимо приведет к полной его переделке если что-то поменяется в консерватории, т.е. в БД
3. Циклы. Та же история с уровнем вложенности. Все очень "зашито", а это плохо.

Все три проблемы решаются с помощью одной, "деревянной" таблицы и рекурсивной выборкой с обходом "деток" при разузловании (как было указано выше).

Добавлено через 7 минут
Опыт показывает, что при больших "деревьях" незачем все его содержимое (вплоть до листьев) тащить на Клиент, юзер просмотрит в лучшем случае процентов 10. Остальные останутся невостребованными.
Поэтому есть способ получше - при первом входе на страницу показываются только узлы 1-го уровня, например континенты.
Если надо посмотреть "Европу", то юзер раскрывает узел с помощью пиктограммки рядом с названием нужного континента (Европы) - при этом асинхронно с сервера извлекаются только страны Европы и раскрываются под Европой. Нужно посмотреть, к примеру Россию, кликаем на иконке рядом с нею и получаем города. И т.д.
Любой узел можно свернуть (клик на развернутой иконке), а потом опять развернуть. При этом второй раз выборки по той же Европе не будет.
При таком алгоритме рекурсия не нужна, нет лишней загрузки SQL-сервера, сети и непосредственно Клиента.
В то же время юзер быстро ориентируется в "дереве" и легко находит то, что нужно
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
25.07.2021, 10:52  [ТС]
Спасибо за ответ, а можете скинуть пример кода для подобного решения? Схему связей
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
25.07.2021, 13:05
aksident, У меня все примеры в MVC + MS SQL Server +EF

Добавлено через 5 минут
Деревянная таблица:

Модель (с профилями пользователей):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public partial class TREEANIMALS
    {
        public TREEANIMALS()
        {
            this.TREENAMES = new HashSet<TREENAMES>();
            this.USERPROFILE = new HashSet<USERPROFILE>();
        }
    
        public int TA_ID { get; set; }
        public Nullable<int> TA_PID { get; set; }
        public string TA_Name { get; set; }
        public Nullable<int> TA_HomeFlag { get; set; }
    
        public virtual ICollection<TREENAMES> TREENAMES { get; set; }
        public virtual ICollection<USERPROFILE> USERPROFILE { get; set; }
    }
SQL:
SQL
1
2
3
4
5
6
  CREATE TABLE TREEANIMALS(
     TA_ID INT IDENTITY (1,1) PRIMARY KEY,
     TA_PID INT,
     TA_Name VARCHAR(MAX),
     TA_HomeFlag INT
  )
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
25.07.2021, 15:54  [ТС]
Профили пользователя это данные вашей таблицы?

Добавлено через 2 часа 38 минут
Хорошо, положим таблицу я создал, что дальше? я только начинаю разбираться, потому задаю, возможно, глупые вопросы.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
25.07.2021, 17:04
Цитата Сообщение от aksident Посмотреть сообщение
Профили пользователя это данные вашей таблицы?
Есть таблица профилей юзеров (логин, пароль и т.д., включая местоположения (город-страна). Отсюда и эта зависимость.
Т.е. когда юзер авторизируется, то он исходно получает таблицу животных в своем городе.
Цитата Сообщение от aksident Посмотреть сообщение
Хорошо, положим таблицу я создал, что дальше?
Дальше напишите запрос получения "деток" по указанному id узла дерева. Именно эти детки и будут показаны в дереве (treeview) при раскрытии узла их папы.
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
25.07.2021, 17:11  [ТС]
У меня один пользователь, это я, мне такое городить незачем
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
25.07.2021, 18:45
Цитата Сообщение от aksident Посмотреть сообщение
У меня один пользователь, это я, мне такое городить незачем
Так и не делайте
Вы задали вопрос и получили ответ.
К "деревянной" таблице юзеры относятся косвенно - просто ссылаются на нее. "Дереву" от этого ни жарко, ни холодно
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
25.07.2021, 19:04  [ТС]
по моему мы не в ту степь понеслись, у меня есть 3 таблицы связанные между собой в порядке подчиненности, мне просто нужно заполнить дерево данными из этих таблиц, да, данных там будет многовато, вот мне нужен совет как это реализовать. Доступ к этому дереву общий для всех пользователей, привязка к ним не нужна.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
25.07.2021, 23:09
Цитата Сообщение от aksident Посмотреть сообщение
мне просто нужно заполнить дерево данными из этих таблиц
"Пилите, Шура, пилите" (Ильф, Петров "Золотой теленок")

Добавлено через 53 минуты
Выборка всего дерева из 3 связанных таблиц
Таблицы:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  CREATE TABLE DIR_CONTINENT(
         CONT_ID INT IDENTITY (1,1) PRIMARY KEY,
     CONT_Name VARCHAR(MAX)
  )
  CREATE TABLE DIR_COUNTRY(
         CNT_ID INT IDENTITY (1,1) PRIMARY KEY,
     CNT_Name VARCHAR(MAX),
     CNT_PID INT REFERENCES DIR_CONTINENT(CONT_ID) NOT NULL  -- Ссылка на континент
  )
  CREATE TABLE DIR_CITY(
         CIT_ID INT IDENTITY (1,1) PRIMARY KEY,
     CIT_Name VARCHAR(MAX),
     CIT_PID INT REFERENCES DIR_COUNTRY(CNT_ID) NOT NULL -- Ссылка на страну
  )
Запрос на выборку всех с сортировкой для заполнения Treview
SQL
1
2
3
4
5
SELECT C3.CONT_Name, C2.CNT_Name, C1.CIT_Name 
  FROM DIR_CITY C1
  LEFT JOIN DIR_COUNTRY C2 ON (C1.CIT_PID =  C2.CNT_ID)
  LEFT JOIN DIR_CONTINENT C3 ON (C2.CNT_PID =  C3.CONT_ID)
  ORDER BY C3.CONT_Name, C2.CNT_Name, C1.CIT_Name
1
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
26.07.2021, 09:17  [ТС]
Спасибо большое за потраченное время

Добавлено через 53 минуты
А не подскажете как это связать с кодом C# конкретного экземпляра treeview?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
26.07.2021, 12:46
Цитата Сообщение от aksident Посмотреть сообщение
А не подскажете как это связать с кодом C# конкретного экземпляра treeview?
Что Вы имеете в виду под "treeview" ?
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
26.07.2021, 12:53  [ТС]
элемент treeview visul studio C#
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
26.07.2021, 13:40
Цитата Сообщение от aksident Посмотреть сообщение
элемент treeview visul studio C#
Какой именно ?
Вы задали вопрос в конференции Web, у Вас Web Forms ?
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
26.07.2021, 14:04  [ТС]
нет, Windows Form

Добавлено через 19 минут
Задал вопрос здесь потому что впервые на этом форуме и не заметил в какой конференции пишу, но удалить запись здесь нельзя, создал тему в соответствующей ветке но там тишина..
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
26.07.2021, 15:56
aksident, Я так понял, что Вы хотите, чтобы Вам написали готовый код загрузки данных в TreeView из иерархически организованных 3 таблиц базы данных ? При этом сами думать не желаете категорически
Просто подумать: указанным выше запросом получаете набор данных (тем же ридером к примеру, про ОРМ ведь Вы не слышали), он уже отсортирован как нужно, и просто пробегаете по нему (while (reader.Read()) и, сравнивая поля-ключи иерархии, добавляете новый узел либо в текущий как дочку, либо создаете новый дочерний и добавляете в него тоже как дочку.

Добавлено через 5 минут
Набрал в гугле c# Загрузка TreeView из БД и первые же 3 ссылки дали практически исчерпывающий ответ, как с рекурсией, так и по вышеприведенному способу с фиксированным количеством уровней с отдельными таблицами по уровням.
1
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
26.07.2021, 16:09  [ТС]
Да, спасибо, я уже почти разобрался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.07.2021, 16:09
Помогаю со студенческими работами здесь

Вывод данных из трех связанных таблиц
Имеется 3 таблицы. Продукты, блюда, продукты_блюда. Связаны по индексам, соответственно таблица продукты_блюда содержит индексы блюд и...

Вывод данных из трёх связанных таблиц
Здравствуйте! Я делаю сайт на ASP.NET MVC, где содержится информация о спектаклях и коллективе театра. Имеется следующая база данных: ...

Связывание двух DGV, заполненных данными из связанных таблиц
В общем задача такая, есть форма с двумя datagridview в splitcontainer-е. Datagridview заполняются из базы Access из двух связанных таблиц....

Сформировать запрос на выборку из трёх связанных таблиц
Всем доброго времени суток! У меня возникла проблема при формировании запроса на выборку из трёх связанных таблиц. В таблице...

Удаление данных из трёх связанных таблиц (Access)
Знаю, что подобная тема не раз поднималась. Но, к сожалению, не нашла решения к своей ситуации. Суть проблемы следующая: Есть 3 таблицы...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru