С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для kikaa
0 / 0 / 0
Регистрация: 24.04.2017
Сообщений: 155

Вывод данных с базы данных в TreeView

22.06.2019, 11:16. Показов 2261. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Помогите разобраться и подкорректировать код, вывожу данные с БД в TreeView , по нажатию на выбранную категорию происходит фильтрация в DBGrid(Скрин 1) , не получается сделать, чтобы первый уровень был "Все категории" т.е
SQL
1
SELECT * FROM Products
, а второй уже "Категория 1", "Категория 2" , "Категория 3" (Скрин 2).
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 begin
Form4.TreeView1.Items.Clear;
 
Dm.CountSQL.SQL.Text:= 'SELECT * FROM Products';
dm.CountSQL.Open;
 
dm.categories.SQL.Text := 'SELECT * FROM categories';
dm.categories.Open;
 
dm.categories.First;
while not dm.categories.Eof do
 begin
  RootNode:= form4.TreeView1.Items.Add(nil, dm.categories.FieldByName('Name').AsString);
  RootNode.Data:= Pointer(dm.categories.FieldByName('ID_cat').AsInteger );
  dm.CountSQL.First;
  while not dm.CountSQL.Eof do
   begin
    if dm.CountSQL.FieldByName('category').AsInteger = dm.categories.FieldByName('id_cat').AsInteger then
     RootNode1:= form4.TreeView1.Items.AddChild(RootNode, dm.CountSQL.FieldByName('category').AsString);
     dm.CountSQL.Next;
    end;
   dm.categories.Next;
end;
end;
Delphi
1
2
3
4
5
6
7
procedure TForm4.TreeView1Click(Sender: TObject);
begin
dm.CountSQL.SQL.Clear;
dm.CountSQL.SQL.Text:= 'SELECT * FROM Products WHERE category =:IDd ';
dm.CountSQL.Parameters.ParamByName('IDd').Value:= ID;
dm.CountSQL.Open;
end;
Миниатюры
Вывод данных с базы данных в TreeView  
Изображения
 
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.06.2019, 11:16
Ответы с готовыми решениями:

Treeview и базы данных
Где можно найти уроки с примерами исходного кода по работе с treeview и базами данных без установки сервера баз данных (используем базы в...

Treeview из базы данных
Добрый день прошу помощи. Пишу прогу RadStudio10 SQL=>ADOconnection=>ADOquery=>Datasoure. Можете подсказать как с двух таблиц загрузить...

Вывод данных из базы данных MySQL в PHP в виде дерева.
У нас в сети решили сделать портал-базу по рефератам. Все я сделал остались две траблы, про первую я здесь и пишу. Итак, имеется база с...

12
5958 / 4534 / 1094
Регистрация: 29.08.2013
Сообщений: 28,137
Записей в блоге: 3
22.06.2019, 14:26
ну так его в базе то нет
если в базе нет - надо самому создать
Delphi
1
RootNode:= form4.TreeView1.Items.Add(nil,'Все категории');
сверху над циклом добавь и все

это не надо делать
Delphi
1
dm.CountSQL.First;
ЗЫ обычно можно вывести просто категории, а уже по клику на нее - вывести полный список
0
 Аватар для kikaa
0 / 0 / 0
Регистрация: 24.04.2017
Сообщений: 155
23.06.2019, 07:40  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
ЗЫ обычно можно вывести просто категории, а уже по клику на нее - вывести полный список
Мне так и нужно, только чтобы при нажатии на пункт "Все категории" ещё была фильтрация в DBGrid
SQL
1
SELECT * FROM Products
qwertehok,я добавил, что Вы написали , но получается так: (Скрин 3) + под каждой категорией стоит id как его убрать ?

Delphi
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
begin
Form4.TreeView1.Items.Clear;
 
Dm.CountSQL.SQL.Text:= 'SELECT * FROM Products';
dm.CountSQL.Open;
 
dm.categories.SQL.Text := 'SELECT * FROM categories';
dm.categories.Open;
 
RootNode:= form4.TreeView1.Items.Add(nil,'Все категории');
 
while not dm.categories.Eof do
 begin
  RootNode:= form4.TreeView1.Items.Add(nil, dm.categories.FieldByName('Name').AsString);
  RootNode.Data:= Pointer(dm.categories.FieldByName('ID_cat').AsInteger );
  dm.CountSQL.First;
  while not dm.CountSQL.Eof do
   begin
    if dm.CountSQL.FieldByName('category').AsInteger = dm.categories.FieldByName('id_cat').AsInteger then
     RootNode1:= form4.TreeView1.Items.AddChild(RootNode, dm.CountSQL.FieldByName('category').AsString);
     dm.CountSQL.Next;
    end;
   dm.categories.Next;
end;
end;
Миниатюры
Вывод данных с базы данных в TreeView  
0
5958 / 4534 / 1094
Регистрация: 29.08.2013
Сообщений: 28,137
Записей в блоге: 3
23.06.2019, 14:32
Цитата Сообщение от kikaa Посмотреть сообщение
но получается так
потому что при создании остальных элементов нужно указывать Родителя
0
 Аватар для kikaa
0 / 0 / 0
Регистрация: 24.04.2017
Сообщений: 155
23.06.2019, 15:46  [ТС]
qwertehok, можно чуть поподробней ? плохо пока в этом разбираюсь)
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
23.06.2019, 19:09
Немножко переделать надо:
Delphi
1
2
3
4
Root:= form4.TreeView1.Items.Add(nil,'Все категории');
while not dm.categories.Eof do
 begin
  RootNode:= form4.TreeView1.Items.Add(Root, dm.categories.FieldByName('Name').AsString);
0
 Аватар для kikaa
0 / 0 / 0
Регистрация: 24.04.2017
Сообщений: 155
23.06.2019, 19:13  [ТС]
qwertehok, разобрался , подскажите пожалуйста как теперь сделать чтобы при нажатии на пункт который создали "Все категории" выполнялась фильтрация в DBgrid
SQL
1
SELECT * FROM Products
Дерево категорий сделал таким образом, правильно?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
begin
Form4.TreeView1.Items.Clear;
 
Dm.CountSQL.SQL.Text:= 'SELECT * FROM Products';
dm.CountSQL.Open;
 
dm.categories.SQL.Text := 'SELECT * FROM categories';
dm.categories.Open;
 
dm.categories.First;
 RootNode:= form4.TreeView1.Items.Add(nil,'Все категории');
while not dm.categories.Eof do
begin
 RootNode1:= form4.TreeView1.Items.AddChild(RootNode, dm.categories.FieldByName('Name').AsString);
 RootNode1.Data:= Pointer(dm.categories.FieldByName('ID_cat').AsInteger );
 dm.CountSQL.First;
 dm.categories.Next;
end;
end;
Добавлено через 4 минуты
Пытливый, спасибо, почитал - разобрался. Сделал, как написал выше, но теперь нужно чтобы при нажатии на "Все категории" тоже выполнялся запрос)
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
23.06.2019, 19:37
Я не вижу, как именно вы запускаете запрос. Обычно это делается по даблклику на узле:
Delphi
1
2
3
4
5
6
procedure TForm1.TreeView1DblClick(Sender: TObject);
begin
 ADOQuery1.SQL.Text := 'select * from Products where Category = :Category';
 ADOQuery1.Parameters.ParamValues['Category'] := TreeView1.Selected.Text;
 ADOQuery1.Open;
end;
0
 Аватар для kikaa
0 / 0 / 0
Регистрация: 24.04.2017
Сообщений: 155
23.06.2019, 19:51  [ТС]
Пытливый, запускаю так:
Delphi
1
2
3
4
5
6
7
procedure TForm4.TreeView1Click(Sender: TObject);
begin
dm.CountSQL.SQL.Clear;
dm.CountSQL.SQL.Text:= 'SELECT * FROM Products WHERE category =:IDd ';
dm.CountSQL.Parameters.ParamByName('IDd').Value:= ID;
dm.CountSQL.Open;
end;
Фильтрация происходит только по категориям , которые в БД, а как присвоить к
Delphi
1
RootNode:= form4.TreeView1.Items.Add(nil,'Все категории');
-
SQL
1
SELECT * FROM Products
?
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
23.06.2019, 19:55
Лучший ответ Сообщение было отмечено kikaa как решение

Решение

Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.TreeView1DblClick(Sender: TObject);
begin
 if TreeView1.Selected.Text <> 'Все категории'
 then begin
         ADOQuery1.SQL.Text := 'select * from Products where Category = :Category';
         ADOQuery1.Parameters.ParamValues['Category'] := TreeView1.Selected.Text;
         end
 else ADOQuery1.SQL.Text := 'select * from Products';
 ADOQuery1.Open;
end;
Добавлено через 1 минуту
По одному клику нежелательно, делайте лучше по даблклику

Добавлено через 3 минуты
И непонятно, зачем вам делать выборку по ID если вы узлы значениями заполняете.
0
 Аватар для kikaa
0 / 0 / 0
Регистрация: 24.04.2017
Сообщений: 155
23.06.2019, 20:13  [ТС]
Когда использую ваш код, выдает ошибку "Несоответствие типов данных..." , сделал так:

Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm4.TreeView1DblClick(Sender: TObject);
begin
 if form4.TreeView1.Selected.Text <> 'Все категории' then begin
dm.CountSQL.SQL.Clear;
dm.CountSQL.SQL.Text:= 'SELECT * FROM Products WHERE category =:IDd ';
dm.CountSQL.Parameters.ParamByName('IDd').Value:= ID;
 end
 else dm.CountSQL.SQL.Text := 'select * from Products';
dm.CountSQL.Open;
end;
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
23.06.2019, 20:21
dm.CountSQL.SQL.Clear; можно не писать, тут он лишний
1
5958 / 4534 / 1094
Регистрация: 29.08.2013
Сообщений: 28,137
Записей в блоге: 3
23.06.2019, 20:38
и ориентироваться лучше не на
Цитата Сообщение от kikaa Посмотреть сообщение
TreeView1.Selected.Text
а в поле Data записывать id поля и смотреть на него
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.06.2019, 20:38
Помогаю со студенческими работами здесь

Вывод данных с базы данных через компоненты Interbase
Здравствуйте, пытаюсь вывести данные с базы данных с помощью компонентов Interbase, но не выходит. Размещаю на форме: - IBDatabase...

Вывод данных из базы данных в определенные строки таблицы
Имеется страница на которую необходимо из бд с названием opis вывести данные названия ЖК из столбца name где id=1 Подключаю базу данных...

Вывод данных из базы данных в выпадающее поле в форме
Создаю выпадающее поле в форме, само поле появляется, но данные из базы данных почему-то не показывает. Делаю все по видео, не понимаю что...

Заполнение treeview из базы данных
Здраствуйте, уважаемые форумчане! у меня вопрос, как можно заполнить treeview из базы данных Access в VB 6 База имеет несколько...

TreeView базы данных и таблицы
Нужно чтобы в форме показывались узлы баз данных, которые содержат ещё и узлы своих таблиц. Но у меня не получается вывести таблицы,...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru