Excel VBA - Создать TreeView из набора записей - PullRequest
0 голосов
/ 05 августа 2009

У меня есть хранимая процедура SQL 05, которая возвращает около 180 строк со структурой:

ID |Имя |ParentId.

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

Я почти выполняю то, что хочу, но не совсем.

Это проблема, которая у меня есть, Рут добавлен ок.Следующий слой вниз добавляется нормально.Однако он не знает, каким должен быть следующий ParentId.Должен ли я просто увеличить переменную и попытаться найти совпадения?Полагаю, я должен включить это в верхний метод.

Надеюсь, я не за горами и мне нужно пушить в правильном направлении,

Большое спасибо заранее Майкл

КакИ наконец, в цикле есть проверки BOF и EOF, так как у меня, кажется, было много ошибок, если у меня их нет.

Private Sub MakeTree(ByVal rs As ADODB.Recordset)
    rs.MoveFirst
    Do Until rs.EOF
        If (IsNull(rs.Fields("ParentID"))) Then
            Call TVFunds.Nodes.Add(, , "Key" + CStr(rs.Fields("Id")), rs.Fields("Name"))
            Call MsgBox("Key" + CStr(rs.Fields("Id")) + " " + rs.Fields("Name"), vbInformation, "Added Root")
        Else
            DrawNode rs, rs.Fields("ParentID"), rs.Fields("ID")
        End If
        If rs.BOF <> True And rs.EOF <> True Then
            rs.MoveNext
        End If
    Loop
End Sub

    Private Sub DrawNode(ByRef r As ADODB.Recordset, ByRef pId As Integer, ByRef Id As Integer)
   r.MoveFirst
   Do Until r.EOF
       If (r.Fields("ParentId") = pId And r.Fields("Id") = Id) Then
            Call TVFunds.Nodes.Add("Key" + CStr(r.Fields("ParentId")), tvwChild, "Key" + CStr(r.Fields("Id")), r.Fields("Name"))
            Call MsgBox("Key" + CStr(r.Fields("ParentId")) + " Key" + CStr(r.Fields("Id")) + " " + r.Fields("Name"), vbInformation, "Added")
            Id = Id + 1
            DrawNode r, pId, Id
        End If
        If r.BOF <> True And r.EOF <> True Then
            r.MoveNext
        End If
    Loop
End Sub

1 Ответ

1 голос
/ 05 августа 2009

Перво-наперво: цикл До ... всегда выполняется хотя бы один раз. Таким образом, если в наборе записей нет строк, он все равно войдет в цикл. Вот почему вы получали эти ошибки без проверок EOF / BOF.

Измените те циклы Do Do ... на циклы Do While ...

Do While Not rs.EOF
        If (IsNull(rs.Fields("ParentID"))) Then
            Call TVFunds.Nodes.Add(, , "Key" + CStr(rs.Fields("Id")), rs.Fields("Name"))
            Call MsgBox("Key" + CStr(rs.Fields("Id")) + " " + rs.Fields("Name"), vbInformation, "Added Root")
        Else
            DrawNode rs, rs.Fields("ParentID"), rs.Fields("ID")
        End If

        rs.MoveNext
Loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...