Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > DBGrid и TreeView


Автор: MyNick 13.10.2005, 09:47
подскажите плиз каким образом монжно связать DBGrid и TreeView, использую mssql, так же компоненты ADOConnection, DataSource и ADOQuery.

Автор: offline 13.10.2005, 10:07
А что ты хочешь получить таким образом? smile

Автор: MyNick 13.10.2005, 12:02
хочу представить базу данных таким способом
TreeView для выбора пункта, а DBGrid для отображения данных...

Автор: offline 13.10.2005, 13:16
ну установи себе EHLib и наслождайся

http://tinypic.com/ej8x29.jpg

или почитай здесь

http://www.delphikingdom.com/asp/viewitem.asp?UrlItem=/helloworld/dbtreeview.htm

Автор: MyNick 13.10.2005, 14:11
EHLib то я ставил тока со свойствами DBGridEh не получилось разобраться, а документацию по нему на русском найти не удалось...

Автор: offline 13.10.2005, 14:13
документация есть на русском и стоит кажись 500 р. smile

Автор: MyNick 13.10.2005, 14:14
а конкретнее как с помощь его реализовать древовидную структуру...
Добавлено @ 14:14
так вот то то и оно..)

Автор: MyNick 13.10.2005, 14:29
подскажите плиз как хоть установить взаимосвязь компонентов и подключить к базе... smile

Автор: offline 13.10.2005, 14:44
TreeView к базе не подключишь.

в ADOConnection устанавливаешь связь с базой.
в ADOTable ставишь источник данныу ADOConnection и задаешь таблицу
в DBGrid связываешь с ADOTable через DataSource

а как создать DBTreeView читай здесь www.delphikingdom.ru/helloworld/dbtreeview.htm

Автор: MyNick 13.10.2005, 14:57
как к самой базе подключить то понятно
именно не получается связать все это в кучу...
может причина в том что голова сеня уже соображать никак не хочет)
спасибо за помощь, если чего еще обращусь)

Автор: Vet 13.10.2005, 16:54
MyNick, если у тебя есть EHLib, то для начала надо было посмотреть Demos'ы и посмотреть, как там реализовано дерево в DBGridEh'e. По-моему, там даже что-то было на русском написано smile

Автор: MyNick 13.10.2005, 17:10
первым делом в Demos'ы и полез) нашел там то что хотелось бы реализовать у себя, но к сожалению по русски там ниче нет а с ковырянием вот проблемы возникли....

Автор: offline 13.10.2005, 17:26
посмотри здесь

...\EhLib\AdvTech\MemTableEh\readme_rus.rtf

Цитата
4. Режим хранения записей в виде дерева (TreeView).
Настройка и активизация режима TreeView осуществляется с помощью подсвойств  объекта TMemTableEh.TreeList. TMemTableEh автоматически добавляет новые записи в дерево, используя свойства TreeList.KeyFieldName и TreeList.RefParentFieldName. При появлении новой записи, MemTable пытается найти для нее Parent запись, осуществляя поиск записей у которых значение поля KeyFieldName равно значению поля RefParentFieldName новой записи. Кроме того, он проверяет, не является ли новая запись Parent записью для уже существующих записей. Формирование дерева записей значительно ускоряется если создать индексы по полям указанным в TreeList.KeyFieldName и TreeList.RefParentFieldName.

Свойства объекта TMemTableEh.TreeList:
Active: Boolean - Определяет, что режим TreeView включен. В режиме TreeView вы можете обращаться к свойствам TMemTableEh: TreeNodeLevel, TreeNodeExpanded, TreeNodeHasChildren, TreeNodeChildCount.
KeyFieldName: String - Содержит название ключевого поля записи. Дочерние записи будут ссылаться на родительскую запись с ключом определенным полем KeyFieldName.
RefParentFieldName: String - Содержит название поля содержащего ссылку на родительскую запись.
DefaultNodeExpanded: Boolean - Определяет значение свойства Expanded для новых узлов дерева.
DefaultNodeHasChildren: Boolean - Определяет значение свойства HasChildren для новых узлов дерева.
FullBuildCheck: Boolean - Определяет необходимость делать проверку на наличие Child записей при добавлении новой записи или изменения существующей, выставление этого свойства в False может ускорить формирование дерева, но при заполнения DataSet'а все Child записи должны идти после Parent записи.

Автор: Vet 13.10.2005, 17:27
В каталоге MemTableEh файл readme_rus.rtf, правда толку от него мало. Если инфы по-русски нет, то только ковыряние и поможет smile. Ничего сложного нет, я разобрался без всякой литературы

Автор: offline 13.10.2005, 17:32
Vet

Цитата
я разобрался без всякой литературы


А яего не ковырял, а немного посмотрел smile насколько я понял, он работает с TMemTableEh т.е. с таблицей в памяти, а можно ли выгрузить результаты в базу или после закрытия проги все данные исчезнут?

Автор: Vet 13.10.2005, 20:33
Цитата(kirilllius @ 13.10.2005, 17:32)
а можно ли выгрузить результаты в базу или после закрытия проги все данные исчезнут?

Это же легко проверить. Создаем тестовую таблицу с 3-мя полями: ID, PARENT_ID, VALUE. Если изменять в гриде, изменения сохраняются для поля VALUE. PARENT_ID же не изменяется

Автор: offline 13.10.2005, 20:54
Создать то можно, просто возиться не охота smile. Спросил так, ради интереса, на будущее, стоит ли это использовать в будущих проектах или обходится без этого smile.

Автор: MyNick 14.10.2005, 08:56
EhLib\AdvTech\MemTableEh\readme_rus.rtf у меня почему то нет...если не сложно вышлине на мыло..
как я понял TMemTableEh тока формирует данные в табличном виде, а каким образом он связывается с DBGrigEh и отображает их?


Автор: MyNick 14.10.2005, 09:25
если все у вас просто получается то объясните мне какие компоненты кидать на форму, какие свойства у кого как выставить, что б они наконец то связались все в кучу... smile

Автор: offline 14.10.2005, 09:58
Давай мыло

Автор: MyNick 14.10.2005, 10:04
[email protected]

Автор: offline 14.10.2005, 10:18
берешь ADOConnection1 и подключаешься к базе в которой должны бать три обязательных поля. Названия полей не важны, например:

ID - Числовое поле
ID_PARENT - Числовое поле
Name - строковое поле

затем ADOTable1 и подключаешься к базе и выбираешь таблицу.
затем DataSetDriverEh1 в KeyFilds имя ключевого поля указываешь ID
ProviderDataSet = ADOTable1

Затем MemTableEh1 в DataDriver = DataSetDriverEh1

забыл еще smile

DataSource1 в DataSet = MemTableEh1

DBGridEh1 в DataSource = DataSource1

и в

Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  MemTableEh1.TreeList.Active := True;
  MemTableEh1.TreeList.KeyFieldName := 'ID';
  MemTableEh1.TreeList.RefParentFieldName := 'ID_PARENT';
  MemTableEh1.TreeList.DefaultNodeExpanded := True;
  MemTableEh1.Open;
end;


при создании ветви в ID заносишь ее номер, а в ID_PARENT заносишь
номер ветви родителя, если родителя нет, то ставишь 0

И самое главное, что бы сохранить изменения в таблице используй
MemTableEh1.ApplyUpdates, а то все изменения теряются, когда программа
закрывается, т.к. они хранятся в таблице памяти.

Автор: MyNick 14.10.2005, 12:48
спасибо большое буду разбераться
сделал все как написал никаких проблем не возникло...
теперь надо DBGrid осваивать)

Автор: Vet 15.10.2005, 11:41
По-моему, древовидная структура в гриде не очень-то и нужна smile ..

Автор: offline 15.10.2005, 15:44
ну кому как, но я тоже не приветствую smile

Автор: MyNick 17.10.2005, 06:49
а где она приветствуется?)

Автор: Vet 17.10.2005, 11:45
В дереве smile

Автор: offline 17.10.2005, 11:53
но дерево к гриду замучаешься клеить smile

Автор: MyNick 18.10.2005, 11:35
эх...
поставил еще Quantum Grid но вот с связкой блин никак разобраться не могу...
покажите плиз наконец то как Grid связывается с таблицей и как же все таки отобразить данные в виде дерева... smile

Автор: offline 18.10.2005, 17:15
А что с EhLib не получилось?

Автор: Vet 18.10.2005, 17:21
MyNick, Ehlib не понравился smile ?

Цитата(kirilllius @ 14.10.2005, 10:18)
берешь ADOConnection1 и подключаешься к базе в которой должны бать три обязательных поля. Названия полей не важны, например:

ID - Числовое поле
ID_PARENT - Числовое поле
Name - строковое поле

затем ADOTable1 и подключаешься к базе и выбираешь таблицу.


Кидаешь на форму компоненты: DataSource, DataSet которого = ADOTable1 и
cxDBTreeList, разворачиваешь свойство DataController, указываешь свой DataSource, выбираешь KeyField и ParentField. Дальше открываешь редактор Bands/Columns cxDBTreeList'a, добавляешь поля TcxDBTreeListColumn. У каждого TcxDBTreeListColumn'а в свойстве DataBinding.FieldName выбираешь имя поля таблицы ADOTable1

Автор: MyNick 19.10.2005, 08:27
а что за компонент cxDBTreeList?

Автор: MyNick 19.10.2005, 09:19
кстати хотел выразить благодарность за собранный материал в DRKB ver. 2.3, много полезной информации там нашел smile

Автор: Vet 19.10.2005, 11:53
Из ExpressQuantumTreeList, а у тебя что - ExpressQuantumGrid?

Автор: MyNick 19.10.2005, 13:18
ага понятно получилось
а с помощью чего можно редактировать количество и содержимое столбцов в запущенной программе и естественно что б данный сохранялись в базу и еще как связать лист с гридом что бы он отображал содержимое соотвествующей строки в листе.... smile smile

Автор: MyNick 19.10.2005, 14:35
при чем насколько понимаю данные должны выбираться с другой таблица и выводится в гриде, получается надо кинуть еще одну table и один DataSource и насторить на них grid , а вот как связать list с grid связать пока не понял...

Автор: Vet 19.10.2005, 17:13
Цитата(MyNick @ 19.10.2005, 13:18)
ага понятно получилось

А что получилось? Компонент-то какой у тебя - cxDBTreeList? Вопросы задавай поконкретнее smile

Автор: Guest 19.10.2005, 17:46
да компонент именно cxDBTreeList, просто не нашел у него свойства DataController , по смыслу понял потом что это DataSource) а вопросы пока остаются прежними.Необходимо что бы одна таблица была связана с cxDBTreeList а другая с Grid и установить их взаимосвязь (при выборе в листе отображаются данные с другой таблице в гриде)

Автор: Vet 19.10.2005, 21:41
Я так понял, в cxDBTreeList у тебя отображаются данные главной таблицы, в "Grid" - подчиненной. Значит, надо в Grid.DataSource.DataSet указать MasterSource = cxDBTreeList.DataController.DataSource.DataSet smile . То есть MasterSource таблицы, которая отображается в гриде, = таблице, которая отображается в cxDBTreeList. И еще настроить MasterFields подчиненной таблицы, ты же знаешь, по каким полям у тебя связаны таблицы smile

Автор: MyNick 20.10.2005, 13:25
таблица взаимосвязать получилось теперь вопрос заключается в следующем
почему не получается редактировать данные в treelist и как разделить столбцы grid -а на подстолбцы?)

Автор: Vet 21.10.2005, 22:20
Цитата
почему не получается редактировать данные в treelist

Сложна сказать, все должно редактироваться, тем более если отображаются данные из таблицы, а не запрос какой-нибудь. Попробуй все удалить и сделать все сначала smile Посмотри, может где-нибудь ReadOnly стоит - у Table или Fields. Только что взял все это на форму накидал для интереса и все работает smile
Цитата
как разделить столбцы grid -а на подстолбцы
не понятно, что ты имеешь в виду

Автор: offline 22.10.2005, 15:07
Цитата
Цитата
как разделить столбцы grid -а на подстолбцы

не понятно, что ты имеешь в виду


Он говорит о том, как двум столбцам сделать один заголовок, т.е. как это DBGridEh делает.

Автор: Vet 22.10.2005, 20:23
А,так надо заглянуть в свойство Position нужных столбцов, свойство BandIndex. После двойного щелчка на компоненте ты попадаешь в редактор, в котором 2 вкладки - Bands и Columns. Каждый столбец находится в определенной Band'e. Вот и создай столько Band, сколько нужно и для каждого столбца задай Position.BandIndex

Автор: FRAGNATIC 30.10.2005, 23:10
у меня древовидноя БД с неогрониченым уровнем вложености
тоесть у раздела может быть куча подразделов а у подразделов тоже могут быть подразделы и так далее
всё это отоброжается в тривиеве (вопрос не в отоброжении )
типа
раздел1
-- раздел2
---- раздел3
-- раздел4
раздел5
хранится это всё в таблице Tree структура её такая
Name-имя раздела
ID - ключивое поле
ParentID - ID родителя тоесть головнова раздела)
и вот возник вопрос как удалять раздел так чтобы и все его подразделы и подразделы подразделов удалились
ведь их может быть бесчётное кол-вл
или одним даже SQL запросм типа
DELETE FROM Tree WHERE ID in (SELECT ID FROM Tree WHERE ParentID in (здесь ещё чё-то))
ни каких постороних компонентов прошу не предлогать =)

Автор: NatikB 5.1.2006, 19:25
http://forum.vingrad.ru/html/emoticons/inlove.gif
smile[color=blue][/color]

Автор: AKN 18.9.2006, 15:18
FRAGNATIC, почитай на http://gsbelarus.com/gs/modules.php?name=News&file=print&sid=314


все вроде нормально описано

Автор: Akella 22.9.2006, 14:06
делай всё напрямую, через MemTable-это всё равно что кушать черер попу

вот форма

Добавлено @ 14:07 
главное - это заполнить дерево
для этого нужно 2 поля
ID и Parent_ID
принцип такой - заполняй сначала самый первый уровень, а при раскрытии уровня подгружай его "детей"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)