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

Тема в разделе "Visual Basic", создана пользователем Bars08, 1 мар 2009.

  1. Bars08

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

    Tanya Гость

    вариант в студию!
     
  3. Bars08

    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

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

    Tanya Гость

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

    Bars08 Гость

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

    Вложения:

    • baze.rar
      Размер файла:
      746 КБ
      Просмотров:
      40
  6. Tanya

    Tanya Гость

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

    Код (Text):
    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
     
  7. Bars08

    Bars08 Гость

    Tanya, благодарю) буду пробовать)
     
Загрузка...

Поделиться этой страницей