• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы Bars08
  • Дата начала
B

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 не знаю как это реализовать. Прошу помощи!
 
B

Bars08

Вариант такой (сделал все таки именно так): думаю, не очень рациональный способ...
но может кому и поможет)
итак, если известно точное количество уровней (как у меня - 4), то распологаем на форме 5 текстбоксов и элемент Adodc (можно Data, он кушает не так много ресурсов, но тогда вместо текстбоксов придется использовать DBCombo, или что то еще, где есть привязка свойства text к отображаемым данным, увы, мне такой не известен:D ). Форму, конечно, можно сделать невидимой) Заполнение 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

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

Tanya

Да, сложновато. Проще использовать объект ADODB.Recordset, который и используется в работе с элементом Adodc1
Я могу объяснить, как можно сделать, если ты предоставишь данные базы или саму базу (не хочется выдумывать данные, сорри)
 
B

Bars08

Был бы очень признателен) база вот
 

Вложения

  • baze.rar
    746 КБ · Просмотры: 239
T

Tanya

все в одной форме
Сначала подключаем в меню Project->References-> Microsoft ActiveX Data Object 2.(x) Library
(выбор из списка, я подключала 2.6, но не думаю, что это принципиально)

Код:
Private cnn As Connection 'подключение к базе
Private rst As Recordset 'нужный набор данных, вместо ADODC

Private Sub Form_Load()
Dim i As Integer
Dim n As Node

On Error Resume Next

'создаем подключение к базе
Set cnn = New Connection
With cnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = App.Path & "/baze/baze.mdb"
.Mode = adModeReadWrite
.Open

If Err Then
Set cnn = Nothing
MsgBox "Ошибка Заполнения древа. Проверьте путь к базе данных", vbOKOnly + vbInformation
Else
Set rst = cnn.Execute("SELECT * FROM urok_")
'или тоже самое 
'Set rst = cnn.Execute("urok_")

If rst Is Nothing Then Exit Sub

'пробегаем по всем записям и вытаскиваем то что нужно
Do While Not rst.EOF
Set n = Nothing

'можно по всем столбцам, или только по 4 как тебе и нужно
For i = 1 To 4 'rst.Fields.Count
Set n = AddNode(i, n) 'вызываем функцию, которая и добавляет если нужно узлы в дерево
Next i

rst.MoveNext
Loop

End If
End With
End Sub

'Ключ каждого узла - <ключ его родителя>.<наименование узла>
Private Function AddNode(ByVal intColNr As Integer, ByVal nParent As Node) As Node
Dim n As Node
Dim Key As String

With Me.TreeView1
Set n = Nothing
Key = rst(intColNr).Value 'берем значение текущего поля

On Error Resume Next

'и пытаемся найти такой узел
If intColNr = 1 Then
'для первого,понятно - родителя нет
Set n = .Nodes(Key) 

If Err Then
'возникла ошибка- такого узла нет, добавляем в дерево
Set AddNode = .Nodes.Add(, , Key, Key)
AddNode.Bold = True 'узлы верхнего уровня выделяем жирным ))) опционально
Else
Set AddNode = n 'нашли - передаем дальше, чтобы в него добавлять
End If
Else

'полная аналоги с первым полем, только идет учет узла-родителя
Set n = .Nodes(nParent.Key & "." & Key)

If Err Then
Set AddNode = .Nodes.Add(nParent.Key, tvwChild, nParent.Key & "." & Key, Key)
Else
Set AddNode = n
End If
End If

AddNode.Expanded = True 'разворачиваем узел
Err.Clear

End With

End Function

пиктограммки узлам ты и сам можешь добавить
Как видишь, принцип похож на твой, но не нужно использовать 2 формы и вспомогательные ЭУ.
Ессно перед выгрузкой формы не забудь установить cnn и rst в nothing
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!