Excel VBA - 从记录集创建Treeview

时间:2009-08-05 14:14:44

标签: excel-vba excel treeview recursion vba

我有一个SQL 05存储过程,它带回大约180行结构:

ID |名称|的ParentId。

我想要做的是根据返回的记录创建一个Treeview。 以下是我在论坛其他地方改编的样本(here

我差点把它做成我想做的但不完全。

这是我的问题, 根添加好了。 下一层添加好了。 但是,它不知道下一个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 个答案:

答案 0 :(得分:1)

首先要做的事情:Do Until ...循环总是至少执行一次。因此,如果记录集没有行,它仍将进入循环。这就是为什么你在没有EOF / BOF检查的情况下得到这些错误的原因。

将那些Do Until ...循环更改为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