下面一段程序是递归调用产生树的问题,快给分吧,对了最后一个参数可以不传任何内容
Public Sub GetCompanyTree(objCompany As Object, objImg As Object, Optional intHighCompanyID As Integer = -1)
  '变量定义
  Dim adors As New ADODB.Recordset
  Dim strTemp As String
  
  '错误处理
  On Error GoTo Err_MSg
  
  '程序处理
  '处理1.1:判断intHighCompanyID(上级单位ID号)的数值,如果为-1则调用一级单位,否则按传值调用
  If intHighCompanyID = -1 Then
  '处理1.1.1:清空公司树
  objCompany.Nodes.Clear
  '处理1.1.2:调出一级单位
  strTemp = "Select Company_ID,CompanyName,CompanyShort from T_Company where HigherCompany_ID = 0"
  '处理1.1.2.1:获得一级单位记录集
  adors.Open strTemp, adoGbCONN
   If Not (adors.EOF Or adors.BOF) Then
      '处理1.1.2.2:创建一级单位树
      Do While Not adors.EOF
         objCompany.Nodes.Add , , "A" & adors(0), IfNullthenEmpty(adors(2)) & "_" & adors(1), objImg.ListImages(3).Index
         '处理1.1.2.3:递归调用创建公司树函数,获得下级公司树
         GetCompanyTree objCompany, objImg, adors(0)
         adors.MoveNext
      Loop
   End If
   objCompany.Nodes(1).Expanded = True
  Else
  '处理1.2.2:调出传值单位
  strTemp = "Select Company_ID,CompanyName,CompanyShort from T_Company where HigherCompany_ID = " & intHighCompanyID & " and Company_ID<> " & intHighCompanyID
  '处理1.2.2.1:获得下级单位记录集
  adors.Open strTemp, adoGbCONN
   If Not (adors.EOF Or adors.BOF) Then
      '处理1.2.2.2:创建下级单位树
      Do While Not adors.EOF
         objCompany.Nodes.Add "A" & CStr(intHighCompanyID), 4, "A" & adors(0), IfNullthenEmpty(adors(2)) & "_" & adors(1), objImg.ListImages(3).Index
         '处理1.2.2.3:递归调用创建公司树函数,获得下级公司树
         GetCompanyTree objCompany, objImg, adors(0)
         adors.MoveNext
      Loop
   End If
  End If
  Set adors = Nothing
  Exit Sub
Err_MSg:
  GetSystemMsg 8004
  Set adors = Nothing
End Sub

解决方案 »

  1.   

    '        Tip:其实很多问题在以前的贴子里都有过很好的解答,我建议大家提问前先搜一下以前的贴子,会节约很多时间的.
    '
    '     Author:吴文智
    '       Date:2001-11-16
    'Description:要试用本例请在窗体中填加一个树和一个按钮
    '            然后在代码窗体中粘贴如下代码
    '            Good luck!Option ExplicitPrivate Sub AddItem(ByVal ParentKey As String, ByVal Key As String, ByVal Text As String)
        'Key值的唯一性你要自己用代码处理啦
        ParentKey = Replace("_" & ParentKey, "__", "_")
        Key = Replace("_" & Key, "__", "_")
        
        Select Case ParentKey
        Case "_0"
            treeView1.Nodes.Add , , Key, Text
        Case Else
            treeView1.Nodes.Add ParentKey, tvwChild, Key, Text
        End Select
    End SubPrivate Sub Command1_Click()
        AddItem 0, 1, "aa"
        AddItem 0, 2, "bb"
        AddItem 1, 3, "cc"
    End Sub
      

  2.   

    to foolishtiger(吴文智):  我好象不是问这个问题,我想知道的是算法
      

  3.   

    这是一个不用算法就可以解决的问题啊.
    用Select Case判断一下就可以完成啦.你把你的每条数据的三部分作为参数传递给AddItem过程试试看,不是达到你要求的效果了吗?
      

  4.   

    如果是子节点就在生成key得时候加前缀child父则加parnet