Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Access treeview примеры

Заполнение Treeview из базы данных

Bars08

Здраствуйте, уважаемые форумчане!
у меня вопрос, как можно заполнить treeview из базы данных Access в VB 6
База имеет несколько таблиц:
klass_
id_k | klass |
__________
predmet_
id_p | klass_p | predmet |
__________
tema_
id_t | predmet_t | tema |

нужно из этих таблиц заполнить соответственно иерархии treeview, но не знаю как. вернее один вариант есть, но он покушает много ресурсов. Структура базы возможно не очень правильная (или неправильная), просто есть очень простой пример на VBA в Access’е, но в VB не знаю как это реализовать. Прошу помощи!

Tanya

Bars08

Вариант такой (сделал все таки именно так): думаю, не очень рациональный способ.
но может кому и поможет)
итак, если известно точное количество уровней (как у меня — 4), то распологаем на форме 5 текстбоксов и элемент Adodc (можно Data, он кушает не так много ресурсов, но тогда вместо текстбоксов придется использовать DBCombo, или что то еще, где есть привязка свойства text к отображаемым данным, увы, мне такой не известен ). Форму, конечно, можно сделать невидимой) Заполнение treeview будет происходить в Form2.
Структура таблицы такова (я для удобсва ее изменил):
urok_
id_u | klass_u | predmet_u | tema_u | urok_u |
И один запрос: z_s_u с одним полем «Count-urok_u» (всего одна запись, отбражает количество уроков)
код такой:

Private Sub Form_Load()
Dim klass As String
Dim predmet As String
Dim tema As String
Dim urok As String
Dim sum_ As String
Dim msg As String
Dim i As Integer
Dim b_name As String
b_name = App.Path & «/baze/baze.mdb»
‘соединяемся
Adodc1.ConnectionString = «Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=» & _
b_name
Adodc1.RecordSource = «z_s_u»
Set Text5.DataSource = Adodc1
Text5.DataField = «Count-urok_u»

If Text1.Text = «» Then
sum_ = 1
Else
sum_ = Text5.Text — 1
End If

Adodc1.RecordSource = «z_urok»
Adodc1.Refresh

Set Text1.DataSource = Adodc1
Text1.DataField = «klass_u»
Set Text2.DataSource = Adodc1
Text2.DataField = «predmet_u»
Set Text3.DataSource = Adodc1
Text3.DataField = «tema_u»
Set Text4.DataSource = Adodc1
Text4.DataField = «urok_u»

‘присваиваем переменным значения из текстбоксов

klass = Text1.Text
predmet = Text2.Text
tema = Text3.Text
urok = Text4.Text

Form2.TreeView1.ImageList = Form2.ImageList1
On Error GoTo ErrorM
‘заполняем узлы «класс» в форме 2
For i = 1 To sum_
If i = 1 Then
Form2.TreeView1.Nodes.Add , , klass, klass, 1
Else
End If
Adodc1.Recordset.MoveNext
If klass = Text1.Text Then
Else
klass = Text1.Text
Form2.TreeView1.Nodes.Add , , klass, klass, 1
End If
Next i

Adodc1.Recordset.MoveFirst
klass = Text1.Text

‘заполняем узлы «предметы»
For i = 1 To sum_
On Error Resume Next
If i = 1 Then
Form2.TreeView1.Nodes.Add klass, tvwChild, klass & predmet, predmet, 2
Form2.TreeView1.Nodes.Item(klass).Expanded = True
Else
End If
Adodc1.Recordset.MoveNext
If klass = Text1.Text And predmet = Text2.Text Then
Else
klass = Text1.Text
predmet = Text2.Text
Form2.TreeView1.Nodes.Add klass, tvwChild, klass & predmet, predmet, 2
Form2.TreeView1.Nodes.Item(klass).Expanded = True
End If
Next i

Adodc1.Recordset.MoveFirst
klass = Text1.Text
predmet = Text2.Text
tema = Text3.Text

‘заполняем узлы «тема»
For i = 1 To sum_
If i = 1 Then
Form2.TreeView1.Nodes.Add klass & predmet, tvwChild, klass & predmet & tema, tema, 3
Else
End If
Adodc1.Recordset.MoveNext
If klass = Text1.Text And predmet = Text2.Text And tema = Text3.Text Then
Else
klass = Text1.Text
predmet = Text2.Text
tema = Text3.Text
Form2.TreeView1.Nodes.Add klass & predmet, tvwChild, klass & predmet & tema, tema, 3
End If
Next i

Adodc1.Recordset.MoveFirst
klass = Text1.Text
predmet = Text2.Text
tema = Text3.Text
urok = Text4.Text

‘заполняем узлы «урок»
For i = 1 To sum_
If i = 1 Then
Form2.TreeView1.Nodes.Add klass & predmet & tema, tvwChild, klass & predmet & tema & urok, urok, 4
Else
End If
Adodc1.Recordset.MoveNext
If klass = Text1.Text And predmet = Text2.Text And tema = Text3.Text And urok = Text4.Text Then
Else
klass = Text1.Text
predmet = Text2.Text
tema = Text3.Text
urok = Text4.Text
Form2.TreeView1.Nodes.Add klass & predmet & tema, tvwChild, klass & predmet & tema & urok, urok, 4
End If
Next i
Form2.Show
Unload Me
Set Form1 = Nothing
Exit Sub
ErrorM:
msg = «Ошибка Заполнения древа. Проверьте путь к базе данных.»
MsgBox msg, , «Ошибка!»
Unload Me
End Sub

если кто поможет сделать лучше и рациональней, буду очень благодарен)

PROИТ

Office 365, AD, Active Directory, Sharepoint, C#, Powershell. Технические статьи и заметки.

Access: построение дерева разделов — TreeView и VBA

Дано: База данных Access 2016 с таблицей, где перечислены разделы (подразделения или другие данные, которые можно представить в виде иерархии).
Задача: на Access-форме построить иерархическое дерево на базе указанной выше таблице.

Допустим имеется таблица подразделений вуза (tblDepartment) в формате:
intID — strDepartmentName — intParentID
Где,
intID — идентификатор подразделения,
strDepartmentName — наименование подразделения,
intParentID — идентификатор родительского подразделения.

Корневой элемент будет ссылаться в качестве «родителя» на самого себя.
Также для удобства в конструкторе таблицы в поле родителя можно задать подстановку, ссылаясь на эту же таблицу:

Текст запроса для подстановки:

После этого в колонке родителя мы сможем выбирать не идентификатору, а по имени подразделения (но в колонке будет по-прежнему храниться идентификатор).

В итоге мы сможем заполнять таблицу следующим образом:

Теперь построим дерево. Для этого создаем пустую форму в режиме конструктора и выберем пункт «Элементы ActiveX»:

В списке выбираем элемент «Microsoft TreeView Control (6.0)»

Выбранный элемент добавляем на форму в нужном месте нужного размера:

Далее переходим в режим кода Visual Basic и добавляем следующий код:

Сохраняем код и форму. Теперь можно запускать форму в режиме просмотра. Должно отобразиться дерево:

Если возникает ошибка: User-defined type not defined (на строке кода ADODB.Recordset), то в VBA в меню Tools — References нужно добавить компонент Microsoft ActiveX Data Objects:

И после этого сделать компиляцию — Debug — Compile.

Как вариант можно использовать таблицу, расположенную в базе на MS SQL Server. Для этого достаточно создать связь с таблицами. Все остальные действия по построению дерева будет аналогичны. В этом случае также возможен обход дерева на стороне MS SQL Server.

9 комментариев :

Этот комментарий был удален автором.

Чтобы работало с node, где родители null

Option Compare Database

Private Sub Form_Load()
Dim strRoot
strRoot = «»

Private Sub AddNode(ByVal ParentID As String)
Set rsCommon = New ADODB.Recordset

If ParentID = «» Then
rsCommon.Open «SELECT Êîä, Ðîäèòåëü, Èìÿ FROM Req DP WHERE IsNull(Ðîäèòåëü)» & » ORDER BY Èìÿ», CurrentProject.Connection, adOpenKeyset, adLockOptimistic

Do While Not rsCommon.EOF
TreeViewDep.Nodes.Add , , Str(rsCommon(«Êîä»)) & «$KEY», rsCommon(«Èìÿ»)
TreeViewDep.Nodes.Item(Str(rsCommon(«Êîä»)) & «$KEY»).Expanded = True
AddNode (Str(rsCommon(«Êîä»)))
rsCommon.MoveNext
Loop
rsCommon.Close
Set rsCommon = Nothing

Else
rsCommon.Open «SELECT Êîä, Ðîäèòåëü, Èìÿ FROM Req DP WHERE Êîä <> Ðîäèòåëü AND Ðîäèòåëü = » & ParentID & » ORDER BY Èìÿ», CurrentProject.Connection, adOpenKeyset, adLockOptimistic

Do While Not rsCommon.EOF
TreeViewDep.Nodes.Add ParentID & «$KEY», tvwChild, Str(rsCommon(«Êîä»)) & «$KEY», rsCommon(«Èìÿ»)
TreeViewDep.Nodes.Item(Str(rsCommon(«Êîä»)) & «$KEY»).Expanded = True
AddNode (Str(rsCommon(«Êîä»)))
rsCommon.MoveNext
Loop
rsCommon.Close
Set rsCommon = Nothing
End If

Здравствуйте. Дорос уже до наполнения дерева по частям. Т.к. элементов несколько тысяч, то построение дерева занимает ощутимое время. Теперь я подгружаю ветку по клику на элемент. Вопрос: как вывести возле элемента значок «+» ? А то неудобно — пока не кликнул, не знаешь есть у этого элемента дочерние позиции или нет

Давно не работала с этим контролом. Может как вариант выводить у каждого элемента в скобках количество дочерних элементов? Или подгружать до клика на элементе хотя бы один его дочерний элемент?

Спасибо за совет. Сейчас эту проблему так и решаю, подгружая дочерние элементы. Но это не совсем удобно, учитывая рекурсивный характер нумерации элементов, который у меня используется. Хотел немного облегчить себе жизнь.

Элемент управления TreeView

Элемент управления TreeView является наиболее впечатляющим элементом управления навигацией. Он не только позволяет генерировать многофункциональные представления деревьев, но и поддерживает заполнение частей дерева по запросу (и без обновления всей страницы). Однако более важным фактом является то, что этот элемент управления поддерживает широкий диапазон стилей, с помощью которых можно преобразовать его внешний вид. Устанавливая всего лишь несколько основных свойств, можно добиться того, что элемент управления TreeView будет выглядеть не как справочный указатель, а как список файлов и папок каталога.

Читать еще:  Что такое acl в foler access

В действительности элемент управления TreeView вообще не нужно генерировать в виде дерева, т.к. он может работать также с неоформленными иерархическими данными — например, с таблицей содержимого — за счет изменения лишь нескольких настроек стиля.

Мы уже рассмотрели пример применения элемента управления TreeView для отображения данных карты сайта. В этом примере использовалась возможность привязки элемента управления TreeView к иерархическим источникам данных. Однако элемент управления TreeView можно также заполнить с помощью привязки к обычному источнику данных (в этом случае получается только один уровень узлов) или за счет самостоятельного создания узлов — либо программно, либо через объявление .aspx.

Последний вариант является самым простым. Например, добавляя дескрипторы в раздел элемента управления TreeView, можно создать несколько узлов:

А вот как добавить TreeNode программно при загрузке страницы:

При первом отображении элемента управления TreeView будут показаны все узлы. Этим поведением можно управлять, устанавливая свойство TreeView.ExpandDepth. Например, если ExpandDepth равно 2, то будут показаны только первые три уровня (уровень 0, уровень 1 и уровень 2). Для определения количества уровней, включенных в TreeView (в свернутом или развернутом состоянии) служит свойство MaxDataBindDepth. По умолчанию это свойство имеет значение -1, при котором видимо все дерево. Однако если, например, установить его в 2, то под начальным узлом будут отображаться только два узла. Узлы можно также программно разворачивать и сворачивать, присваивая свойству TreeNode.Expanded значение true или false.

Это только небольшая часть из того, что может делать TreeView. Чтобы использовать его максимально эффективно, нужно понять, как производится настройка ряда деталей объекта TreeNode.

Объект TreeNode

Каждый узел в дереве представлен объектом TreeNode. Как вы уже знаете, каждый объект TreeNode имеет связанный с ним фрагмент текста, отображаемый в дереве. Объект TreeNode предлагает также свойства навигации, такие как ChildNodes (коллекция узлов, которые он содержит) и Parent (контейнерный узел, расположенный в дереве на уровень выше). Наряду с этим объект TreeNode предоставляет набор свойств, перечисленных в таблице ниже:

Текст, отображаемый в дереве для данного узла

Текст контекстной подсказки, который появляется при наведении указателя мыши на текст узла

Хранит неотображаемое значение с дополнительными данными об узле (например, уникальный идентификатор, который будет использоваться при обработке событий щелчков для идентификации узла или поиска дополнительной информации)

Если установить это свойство, оно автоматически переадресует пользователя по соответствующему URL-адресу после выбора узла, в противном случае придется повторно отреагировать на событие TreeView.SelectedNodeChanged, чтобы решить, какое действие нужно выполнить

Если свойство NavigateUrl установлено, то это свойство задает искомое окно или фрейм для ссылки. Если свойство Tagret не установлено, то в текущем окне браузера открывается новая страница. TreeView также имеет свойство Target, с помощью которого можно применить цель по умолчанию для всех экземпляров TreeNode

Изображение, которое отображается рядом с этим узлом

Текст контекстной подсказки для изображения, отображаемого рядом с узлом

Необычной особенностью объекта TreeNode является то, что он может использоваться в одном из двух режимов. В режиме выбора щелчок на узле приводит к обратной отправке страницы и генерации события TreeView.SelectedNodeChanged. Это режим по умолчанию для всех узлов. В режиме навигации щелчок на узле приводит к переходу на новую страницу без генерации события SelectedNodeChanged. Объект TreeNode перейдет в режим навигации, если свойству NavigateUrl присвоить значение, отличное от пустой строки. Объект TreeNode, привязанный к данным карты сайта, работает в режиме навигации, поскольку каждый узел карты сайта предоставляет информацию об URL-адресе.

В следующем примере элемент управления TreeView заполняется результатами запроса к базе данных. Способность TreeView к отображению иерархических данных желательно использовать для создания списка типа «главный-детальный». Поскольку ASP.NET не включает никакого элемента управления источником данных, который мог бы осуществлять запрос к базе данных и предлагать результаты в виде иерархического источника данных, применять связывание данных нельзя. Вместо этого нужно программно запросить таблицу и вручную создать структуру TreeNode.

Вот как выглядит код, в котором реализуется этот подход:

При щелчке на узле можно обработать событие SelectedNodeChanged, чтобы показать информацию об узле:

Результат выполнения этого кода показан на рисунке ниже:

Упростить код страницы в этом примере можно несколькими способами. Один из них заключается в привязке к XML-данным, а не к реляционным данным. Поскольку SQL Server 2000 и последующие его версии могут выполнять XML-запросы с помощью конструкции FOR XML, можно извлечь данные, оформленные в специфической XML-разметке, а затем привязать их посредством элемента управления XmlDataSource. Единственным ухищрением будет то, что поскольку XmlDataSource предполагает, что вы будете привязываться к файлу, свойство Data понадобится установить вручную с применением XML-данных, полученных из базы данных.

Заполнение узлов по запросу

При наличии очень большого объема данных, которые нужно отобразить в элементе управления TreeView, не исключено, что вы не захотите заполнять его всеми этими данными за один раз. Это приведет не только к увеличению времени обработки первоначального запроса страницы, но и к существенному увеличению размера страницы и состояния представления.

К счастью, элемент управления TreeView обладает возможностью заполнения по запросу, что позволяет упростить заполнение ветвей дерева по мере их расширения. Кроме того, при необходимости заполнение по запросу можно применять к выбранным частям дерева.

Чтобы использовать заполнение по запросу, нужно присвоить значение true свойству PopulateOnDemand любого элемента управления TreeView, который в текущий момент имеет необходимое для заполнения содержимое. Когда пользователь развернет эту ветвь, элемент управления TreeView инициирует событие TreeNodePopulate, которое можно будет применять для добавления следующего уровня узлов. При желании этот уровень узлов может содержать другой уровень узлов, заполняемых по запросу.

Хотя программная модель остается неизменной, TreeView поддерживает два способа заполнения узлов по запросу. Если свойство TreeView.PopulateNodesFromClient имеет значение true (по умолчанию), то TreeView выполняет обратный вызов на стороне клиента, чтобы извлечь необходимые узлы из события, не отправляя обратно всю страницу целиком. Если PopulateNodesFromClient установлено в false или если оно равно true, но TreeView обнаруживает, что текущий браузер не поддерживает обратные вызовы на стороне клиента, то TreeView выполняет обычную обратную отправку для получения того же результата. Единственное отличие заключается в том, что вся страница будет обновлена в браузере, генерируя не такой гладкий интерфейс. (Он позволяет также генерировать другие страничные события, например, события изменения элемента управления.)

Средство заполнения по запросу можно применить в предыдущем примере. Вместо того чтобы заполнять все дерево во время загрузки страницы, можно начать с добавления только узлов категорий, настраивая их для заполнения по запросу:

Теперь необходимо отреагировать на событие TreeNodePopulate, чтобы заполнить категорию при ее разворачивании. В рассматриваемом примере единственными узлами, которые сами заполняются по запросу, являются категории. Если же будет несколько уровней узлов, в которых используется заполнение по запросу, можно проверить TreeNode.Depth, чтобы определить, какой тип узла развернут:

Данный узел заполняется по запросу только один раз. После этого значения остаются доступными на стороне клиента, и обратный вызов не будет выполняться при сворачивании и разворачивании этого узла.

Стили элемента управления TreeView

Элемент управления TreeView имеет подробную модель стилей, которая позволяет полностью управлять его внешним видом. Каждый стиль применяется к типу узла. Стили представляются классом TreeNodeStyle, который унаследован от обычного класса Style. Подобно другим многофункциональным элементам управления, с помощью стилей можно настраивать цвета фона и изображения, шрифты и границы. Кроме того, класс TreeNodeStyle добавляет свойства стилей, специфичные для узлов (таблица ниже). Эти свойства связаны с изображением узла и пространством вокруг него:

Читать еще:  Запрос по дате в access

Сохранение древовидных структур в базе данных

Древовидные структуры не относятся напрямую к программированию баз данных, тем не менее, программисту нередко приходится «изобретать велосипед», придумывая различные решения сохранения таких структур в таблице, и обратное их считывание в дерево .

Типичный пример дерева — всем знакомое дерево каталогов. Примеров таких структур множество — это могут быть отделы в каком-либо учреждении или разделы библиотеки. Посмотрим на рисунок с фрагментом дерева разделов библиотеки:

Основная сложность хранения деревьев в таблице — это то, что мы не знаем заранее, какова будет глубина вложенности разделов. Можно было бы создать таблицу с 10 полями, например. Но если вложенных разделов будет меньше, то таблица будет неэффективна — останется много пустых полей. А если больше — ограничивать пользователя?

Самый простой способ сохранения структуры дерева и ее считывания обратно — воспользоваться тем, что дерево — это список узлов, и имеет хорошо знакомые нам методы:

Однако этот способ имеет массу недостатков. Во-первых, в результате получим простой текстовый файл , в котором вложенные узлы располагаются ниже родителя и имеют отступ . Пользователь легко может случайно или намеренно испортить такой файл , отредактировав или просто удалив его с диска, и программа будет работать с ошибками. Во-вторых, обычно древовидная структура тесно связана с другими данными, например, таблица отделов предприятия связана со служащими этого предприятия — запись каждого служащего имеет ссылку на отдел, где он работает. Если структуру предприятия хранить в простом текстовом файле, то такую связь сложно будет обеспечить.

Когда программист впервые сталкивается с необходимостью хранения древовидных структур в базе данных, обычно он первым делом подключается к Интернету и ищет какой-нибудь компонент , который бы позволил это делать. Но не все нестандартные компоненты работают качественно, да и зачем искать какой-то новый компонент , когда имеется стандартный TreeView на вкладке Win32 Палитры компонентов ? Именно с этим компонентом мы и будем работать в данной лекции.

Рецептов работы с деревьями в базах данных много, мы рассмотрим лишь один из них, достаточно эффективный и в то же время простой. Смысл этого способа состоит в том, чтобы в каждой записи таблицы сохранять номер узла раздела, номер его родителя, если он есть, и название узла. В случае если узел не имеет родителя (главный узел, например, «Художественная литература» в рисунке 10.1), то в соответствующее поле запишем ноль.

Подготовка проекта

Для реализации примера нам потребуется новая база данных . Загрузите MS Access и создайте базу данных » TreeBD «, а в ней таблицу » Razdels «. Вообще-то, в базе данных MS Access как таблицы, так и поля могут иметь русские названия, однако мы будем использовать средства SQL , который не всегда корректно обрабатывает русские идентификаторы. Кроме того, данный способ можно использовать в любой СУБД , а далеко не все из них так предупредительны, как MS Access , поэтому название таблицы и ее полей выполним латиницей.

Таблица будет иметь три поля:

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

Далее создадим в Delphi новый проект и простую форму:

Как всегда, назовите форму fMain , в свойстве Caption напишите «Реализация сохранения дерева в БД «, модуль формы сохраните как Main , а проект в целом назовите, например, TreeToBD . Сделанная база данных TreeBD должна быть в той же папке, что и проект.

Далее установите компонент TreeView ( дерево ) с вкладки Win32. Его свойству Align присвойте alLeft, чтобы дерево заняло весь левый край. Затем можете установить сплиттер — разделитель, ухватившись за который пользователь сможет менять ширину дерева. Компонент Splitter находится на вкладке Additional и его свойство Align по умолчанию равно alLeft — разделитель «прилепится» к правому краю дерева.

Правее установите сетку DBGrid с вкладки Data Controls, и его свойству Align присвойте alClient, чтобы сетка заняла все оставшееся место . Ни главное меню , ни панель инструментов нам здесь не потребуются, используем лишь два всплывающих PopupMenu — первый для дерева, второй для сетки (выберите соответствующие PopupMenu в свойстве PopupMenu этих компонентов).

Далее с вкладки ADO нам потребуется компонент ADOConnection для соединения с базой данных, таблица ADOTable и запрос ADOQuery для вспомогательных нужд. С вкладки Data Access — компонент DataSource, для связи сетки с таблицей. Подключите ADOConnection к базе данных и откройте соединение ( «ADO. Связь с таблицей MS Access» ). Таблицу подключите к ADOConnection (свойство Connection ), затем выберите в свойстве TableName нашу таблицу » Razdels «, а свойство Name переименуйте в tRazdels — так будем обращаться к таблице. Для удобства отображения названия полей откройте редактор полей таблицы (дважды щелкнув по ней), добавьте все поля и у каждого поля измените свойство DisplayLabel, соответственно, на «№», «Родитель» и «Название». Не забудьте открыть таблицу.

Компонент DataSource подключите к tRazdels , а сетку — к DataSource, в сетке должны отобразиться поля. Кроме того, переименуйте свойство Name запроса ADOQuery1 в Q1, ведь нам часто придется обращаться к нему по имени. Запрос также подключите к ADOConnection, но делать его активным не нужно.

На этом приготовления закончены.

Создание и сохранение в таблицу дерева разделов

Работа с деревьями состоит из двух этапов:

  1. Сохранение дерева в таблицу.
  2. Считывание дерева из таблицы.

В этом разделе лекции разберем первый этап. Щелкните дважды по компоненту PopupMenu1, который «привязан» к дереву, и создайте в нем следующие разделы :

  • Создать главный раздел
  • Добавить подраздел к выделенному
  • Переименовать выделенный
  • Удалить выделенный
  • Свернуть дерево
  • Развернуть дерево

Все эти команды относятся к работе с разделами дерева. Прежде всего, создадим обработчик для команды «Создать главный раздел». Листинг процедуры смотрите ниже:

Разберем код. Переменная NewRazd имеет тип TTreeNode , к которому относятся все разделы и подразделы (узлы) дерева. В текстовую переменную s с помощью функции InputQuery() мы получаем имя нового главного узла. Функция имеет три строковых параметра:

  1. Заголовок окна.
  2. Пояснительная строка.
  3. Переменная, куда будет записан введенный пользователем текст.

Если переменная , передаваемая в качестве третьего параметра, пуста, то поле ввода будет пустым. Если же в ней содержался текст — он будет выведен как текст «по умолчанию». Функция возвращает True, если пользователь ввел (или изменил) текст, и False в противном случае. В результате работы функции для пользователя будет выведено простое окно с запросом:

мы снимаем выделение, если какой либо раздел был выделен, ведь мы создаем главный раздел, не имеющий родителя. Свойство Selected компонента TreeView указывает на выделенный узел и позволяет производить с ним различные действия, например, получить текст узла:

А присваиваемое значение nil (ничто) снимает всякое выделение, если таковое было. Далее мы создаем сам узел:

Разберем эту строку подробней. Переменная NewRazd — это новый узел дерева. Каждый узел — объект , обладающий своими свойствами и методами. Все узлы хранятся в списке — свойстве Items дерева TreeView, а метод Add() этого свойства позволяет добавить новый узел. У метода два параметра — выделенный узел (у нас он равен nil ) и строка текста, которая будет присвоена новому узлу. Таким образом, в дереве появляется новый главный узел.

Читать еще:  Форма со списком access

Затем мы сохраняем его в базу данных, предварительно добавив в таблицу новую запись :

Вы помните, что такие методы, как Append или Insert автоматически переводят таблицу в режим редактирования, поэтому вызывать метод Edit излишне?

Обратите внимание на то, что мы сохраняем ноль в поле «R_ Parent «, так как это — главный раздел, не имеющий родителя. Свойство Text нового узла NewRazd содержит название нового узла, которое мы присваиваем полю «R_Name».

Далее сгенерируем процедуру для команды меню «Добавить подраздел к выделенному»:

Код этой процедуры очень похож на код предыдущей, но есть и отличия. Прежде всего, мы проверяем — а имеется ли выделенный раздел? Ведь фокус ввода мог быть и на сетке DBGrid, когда пользователь щелкнул правой кнопкой по дереву, и выбрал эту команду. В этом случае, если не делать проверки, мы получим ошибку, пытаясь добавить дочерний узел к пустоте.

Далее, мы ввели строковую переменную z , чтобы сформировать запрос . Ведь пользователю будет удобней, если в окне InputQuery() он сразу увидит, к какому именно разделу он добавляет подраздел.

Затем, при добавлении дочернего узла вместо метода Add() мы используем метод AddChild() .

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

Запрос формирует набор данных с единственной строкой — записью родителя добавляемого элемента. Поле Q1[‘R_Num’], как вы понимаете, хранит номер этого родителя в запросе.

Код процедуры переименования выделенного раздела выглядит так:

Здесь комментарии достаточно подробны, чтобы вы разобрались с кодом. Следует обратить внимание на то, что вначале мы исправляем запись в таблице, и только потом — в узле. Если бы мы сначала исправили текст узла, как бы затем нашли старую запись в таблице? Пришлось бы вводить дополнительную переменную для хранения старого текста.

Удаляется выделенный узел еще проще:

Далее нам осталось сгенерировать процедуры для сворачивания и разворачивания дерева. Делается это одной строкой:

Итак, метод FullCollapse дерева TreeView сворачивает его узлы, а метод FullExpand разворачивает.

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

picoware Treeview
for Microsoft Access

native Access — available as source code!

A treeview without MsComCtl.ocx.

. and even without any other external ressource

Get the demo that matches your Access.

. or apply our 20% discount code OnTV immediatedly!

It’s native Access

No ActiveX — no OCX — no DLL!

Where ever you have Access, this treeview works!

  • with 2016, with 2013, with 2010, with 2007, with 2003 and even with XP
  • with 32-Bit and 64-Bit
  • without any add in
  • and with no effort for the IT department

. and you’ll get the complete source — with all examples!

Insert data with SQL

The treeview is directly connected to your database.

You insert nodes with just a SQL statement.

Options are set with and additional field in SQL.

Use your own icons

Help your users to focus on their objectives by guiding them with your own, dedicated icons!

. and keep it simple for you — handle your icons with copy & paste. Paint is good enough!

Navigation —
Choose your style!

There are lots of styles for navigation in treeviews — you master them all!

Use one of the styles included in our package or design your own
It’s as simple as copy & paste icons!

Checkboxes: it’s not just on/off

Checkboxes are icons for ‘ON’ and ‘OFF’ — just two.

. we have improved that!

Choose any icon set that matches your state context and use as many states as you need. You even can create your own state icon sets
. it’s copy & paste!

Highlight with colors

Colors can indicate relations or metrics.

You can use all RGB colors as background and each item can have a different one!

Lots of design options

  • Form background
  • Fonts and font colors
  • Icons
  • Margins and padding
  • Symbols at the right side

Belief it or not — even this is a fully functional treeview!

Too many items? Never!

If you want to organize a huge amount of items without any effort — use the automatic grouping option. It creates an optimized alphabetic index for tens of thousands of nodes within seconds.

. or supply your own grouping, if you can derive it from your data.

In-Place-Edit

Need more interaction? Give edit capabilities to your users and let them change the caption of your items.

The treeview keeps you informed about changes so you know, what to store in your database.

Full source included:
Access database explorer

When you drill down into a treeview, every node you open reveals the next level of information.

So — what would you see, if your node was an Access database?

We did a little brainstorming.

. just download our demo and enjoy an utter new insight into your databases!

Fair licenses

For sure — our licensing conditions are to protect our intellectual property.
. what is not so easy, because we deliver source code.

Equally sure: you will not accept unreasonable restrictions — an attitude we fully share!

So we tried to keep our licensing conditions as fair as possible.

  • No restrictions on your rights on your applications
  • Source code delivery to your customers possible if only for documentation

We are developers as presumably you are. So our intention is to provide you the best tools possible and make them really useful for you. So, in a fair relationship, we see our part in having licensing conditions that you can comply with — without unduly limitations in the economic exploitation of your work.

So please get in contact with us, if there is any aspect you can’t comply with.

Need Support?

Of course we will help you — personally, directly and competently! So we don’t use a call center.

Please understand, however, that we can only support you by e-mail or via our contact form.

And of course, here is the hint that every support gladly gives:
Please read the documentation and check our FAQ for a possible solution.

A huge range of features — all as source code

Can’t believe it? Check out our demo. You will find examples for all shown features. And this demo is growing every time we invent something new.

The download of our demo is free, of course — it’s an MDE.
However, our customers will receive the corresponding MDB — not crypted and not locked — and can copy the treeview forms, code and objects as well as all examples into their own applications. And it works with Access 2016, 2010, 2003 and even with XP — with 32-bit or 64.

© 2005-2017 picoware gmbh, Lindenstr. 14, 16548 Glienicke (Berlin), Germany

Ссылка на основную публикацию
Adblock
detector