'显示树形列表 Public Sub ListTree() Dim nodX As Node Dim lngCount As Long '添加学生类型 treList.Nodes.Clear Set nodX = treList.Nodes.Add(, , "tvwMain", "网上选课系统", 1) Set nodX = treList.Nodes.Add("tvwMain", tvwChild, "Stu", "学生信息", 2) Adodc1.RecordSource = "select * from typelist" Adodc1.Refresh frmSysSet.cboJieBie.Clear frmMain.cboStuJie.Clear If Adodc1.Recordset.RecordCount = 0 Then Adodc1.RecordSource = "select KCI_bianhao,KCI_keming from KeChengInfo " Adodc1.Refresh If Adodc1.Recordset.RecordCount = 0 Then Set nodX = treList.Nodes.Add("tvwMain", tvwChild, "Ke", "选修课信息", 4) nodX.EnsureVisible Exit Sub Else GoTo lmg End If End If With Adodc1.Recordset While Not .EOF lngCount = lngCount + 1 Set nodX = treList.Nodes.Add("Stu", tvwChild, "Stu" & lngCount, Trim(!sx) + "届", 3) frmSysSet.cboJieBie.AddItem Trim$(!sx) + "届" 'frmDaoLu.cboDelStuJie.AddItem Trim$(!sx) + "届" frmMain.cboStuJie.AddItem Trim$(!sx) + "届" .MoveNext Wend End With nodX.EnsureVisible'添加课程类型 lmg: Set nodX = treList.Nodes.Add("tvwMain", tvwChild, "Ke", "选修课信息", 4) Adodc1.RecordSource = "select KCI_bianhao,KCI_keming from KeChengInfo " Adodc1.Refresh 'Adodc1.Recordset.MoveFirst With Adodc1.Recordset While Not .EOF lngCount = lngCount + 1 Set nodX = treList.Nodes.Add("Ke", tvwChild, "Ke" & lngCount, Trim(!KCI_keming) & "(" & Trim(!KCI_bianhao) & ")", 5) .MoveNext Wend End With nodX.EnsureVisible End Sub
'On Error Resume Next iIndex = 0 With cnn.RST cmdStart.Enabled = False cnn.OpenRST ("Select * from KC_tab where KC_SelState=1 Order By KC_code asc") While Not .EOF And Not .BOF sKey(iIndex) = "sKey" & LRrim(.Fields("KC_code")) tvwCourse.Nodes.Add , , sKey(iIndex), .Fields("KC_Code"), 1 TempRst.Open "Select * from Stud_course_tab where KC_code='" & .Fields("KC_Code") & "' Order By Stud_code asc", cnn.objCnn, adOpenStatic, adLockBatchOptimistic While Not TempRst.EOF And Not TempRst.BOF tvwCourse.Nodes.Add sKey(iIndex), tvwChild, , TempRst.Fields("Stud_Code"), 3 TempRst.MoveNext Wend .MoveNext TempRst.Close iIndex = iIndex + 1 Wend End With Set TempRst = Nothing
我的方法是使用递归法. 函数如下(有些地方使用了自定义函数,你可以修改一下):'/树操作基本参数列表. Type BaseParameter Cnn As ADODB.Connection 'ADODB 连接 TrvName As Object '树名称. TabName As String '树对应的数据表名 ParFld As String '数据表中父节点的字段名. ChildFld As String '数据表中子节点的字段名. TextFld As String '数据表中节点文本名称的字段名. RootIco As String '树中根目录的图标号. Parico As String '树中父节点的图标号. ExpParIco As String '树中展表一个节点时的图标号. ChildIco As String '树中子节点的图标号. RootText As String '树中根节点的文件. End TypeDim TrvBasePar As BaseParameter' '单表填充TREEVIEW '函数:FillTreeView '参数:SelectSql 一条没有WHERE条件表达式的SELECT语句. '返回值: '说明:SELECT语句中必须包括三项:父节点的字段名,子节点的字段名.节点的标签字段名 ' 所有节点的KEY值是:G + 节点的ID号.Text值是:节点的标签名. Public Function FillTreeView(SelectSql As String) If TrvBasePar.TrvName Is Nothing Then Exit Function End If Call FillTree("", "", SelectSql) End Function
'/用递归法填充树视图 Private Function FillTree(ParFldValue As String, _ ParKey As String, _ SelectSql As String) Dim N As Long Dim NodeX As Node Dim StrSql As String Dim Rs As New ADODB.Recordset Dim RsB As New ADODB.Recordset Dim ParentArr() As String '记录有子节点的节点 Dim AddId As Long Dim ChildKey As String, ChileStr As String Dim Pid As String, PKey As String Dim TagStr As String
AddId = 0 If Len(ParFldValue) = 0 Then Set NodeX = TrvBasePar.TrvName.Nodes.Add(, , "G0000", TrvBasePar.RootText, "ROOT") NodeX.Expanded = True Call FillTree("0000", "G0000", SelectSql) Else StrSql = SelectSql & " Where " & TrvBasePar.ParFld & "='" & ParFldValue & "'" Set Rs = M_DbCtrl.RsOpen(TrvBasePar.Cnn, StrSql) If Not (Rs.EOF And Rs.BOF) Then Rs.MoveFirst While Not Rs.EOF ChildKey = "G" & CStr("" & Rs.Fields(TrvBasePar.ChildFld)) Set NodeX = TrvBasePar.TrvName.Nodes.Add(ParKey, tvwChild, ChildKey, _ CStr("" & Rs.Fields(TrvBasePar.TextFld)), TrvBasePar.ChildIco)
StrSql = "Select Top 1 " & TrvBasePar.TabName & "." & TrvBasePar.ChildFld & " From " & TrvBasePar.TabName & _ " Where " & TrvBasePar.ParFld & "='" & CStr("" & Rs.Fields(TrvBasePar.ChildFld)) & "'" Set RsB = M_DbCtrl.RsOpen(TrvBasePar.Cnn, StrSql) If Not (RsB.EOF And RsB.BOF) Then NodeX.Image = TrvBasePar.Parico AddId = AddId + 1 ReDim Preserve ParentArr(1, AddId) ParentArr(0, AddId - 1) = CStr("" & Rs.Fields(TrvBasePar.ChildFld)) ParentArr(1, AddId - 1) = CStr("G" & CStr("" & Rs.Fields(TrvBasePar.ChildFld))) End If Rs.MoveNext Wend Set Rs = Nothing If AddId > 0 Then For N = 0 To AddId - 1 Pid = ParentArr(0, N) PKey = ParentArr(1, N) Call FillTree(Pid, PKey, SelectSql) Next End If End If End If End Function
Public Sub ListTree()
Dim nodX As Node
Dim lngCount As Long
'添加学生类型
treList.Nodes.Clear
Set nodX = treList.Nodes.Add(, , "tvwMain", "网上选课系统", 1)
Set nodX = treList.Nodes.Add("tvwMain", tvwChild, "Stu", "学生信息", 2)
Adodc1.RecordSource = "select * from typelist"
Adodc1.Refresh
frmSysSet.cboJieBie.Clear
frmMain.cboStuJie.Clear
If Adodc1.Recordset.RecordCount = 0 Then
Adodc1.RecordSource = "select KCI_bianhao,KCI_keming from KeChengInfo "
Adodc1.Refresh
If Adodc1.Recordset.RecordCount = 0 Then
Set nodX = treList.Nodes.Add("tvwMain", tvwChild, "Ke", "选修课信息", 4)
nodX.EnsureVisible
Exit Sub
Else
GoTo lmg
End If
End If
With Adodc1.Recordset
While Not .EOF
lngCount = lngCount + 1
Set nodX = treList.Nodes.Add("Stu", tvwChild, "Stu" & lngCount, Trim(!sx) + "届", 3)
frmSysSet.cboJieBie.AddItem Trim$(!sx) + "届"
'frmDaoLu.cboDelStuJie.AddItem Trim$(!sx) + "届"
frmMain.cboStuJie.AddItem Trim$(!sx) + "届"
.MoveNext
Wend
End With
nodX.EnsureVisible'添加课程类型
lmg: Set nodX = treList.Nodes.Add("tvwMain", tvwChild, "Ke", "选修课信息", 4)
Adodc1.RecordSource = "select KCI_bianhao,KCI_keming from KeChengInfo "
Adodc1.Refresh
'Adodc1.Recordset.MoveFirst
With Adodc1.Recordset
While Not .EOF
lngCount = lngCount + 1
Set nodX = treList.Nodes.Add("Ke", tvwChild, "Ke" & lngCount, Trim(!KCI_keming) & "(" & Trim(!KCI_bianhao) & ")", 5)
.MoveNext
Wend
End With
nodX.EnsureVisible
End Sub
iIndex = 0
With cnn.RST
cmdStart.Enabled = False
cnn.OpenRST ("Select * from KC_tab where KC_SelState=1 Order By KC_code asc")
While Not .EOF And Not .BOF
sKey(iIndex) = "sKey" & LRrim(.Fields("KC_code"))
tvwCourse.Nodes.Add , , sKey(iIndex), .Fields("KC_Code"), 1
TempRst.Open "Select * from Stud_course_tab where KC_code='" & .Fields("KC_Code") & "' Order By Stud_code asc", cnn.objCnn, adOpenStatic, adLockBatchOptimistic
While Not TempRst.EOF And Not TempRst.BOF
tvwCourse.Nodes.Add sKey(iIndex), tvwChild, , TempRst.Fields("Stud_Code"), 3
TempRst.MoveNext
Wend
.MoveNext
TempRst.Close
iIndex = iIndex + 1
Wend
End With
Set TempRst = Nothing
函数如下(有些地方使用了自定义函数,你可以修改一下):'/树操作基本参数列表.
Type BaseParameter
Cnn As ADODB.Connection 'ADODB 连接
TrvName As Object '树名称.
TabName As String '树对应的数据表名
ParFld As String '数据表中父节点的字段名.
ChildFld As String '数据表中子节点的字段名.
TextFld As String '数据表中节点文本名称的字段名.
RootIco As String '树中根目录的图标号.
Parico As String '树中父节点的图标号.
ExpParIco As String '树中展表一个节点时的图标号.
ChildIco As String '树中子节点的图标号.
RootText As String '树中根节点的文件.
End TypeDim TrvBasePar As BaseParameter'
'单表填充TREEVIEW
'函数:FillTreeView
'参数:SelectSql 一条没有WHERE条件表达式的SELECT语句.
'返回值:
'说明:SELECT语句中必须包括三项:父节点的字段名,子节点的字段名.节点的标签字段名
' 所有节点的KEY值是:G + 节点的ID号.Text值是:节点的标签名.
Public Function FillTreeView(SelectSql As String)
If TrvBasePar.TrvName Is Nothing Then
Exit Function
End If
Call FillTree("", "", SelectSql)
End Function
'/用递归法填充树视图
Private Function FillTree(ParFldValue As String, _
ParKey As String, _
SelectSql As String)
Dim N As Long
Dim NodeX As Node
Dim StrSql As String
Dim Rs As New ADODB.Recordset
Dim RsB As New ADODB.Recordset
Dim ParentArr() As String '记录有子节点的节点
Dim AddId As Long
Dim ChildKey As String, ChileStr As String
Dim Pid As String, PKey As String
Dim TagStr As String
AddId = 0
If Len(ParFldValue) = 0 Then
Set NodeX = TrvBasePar.TrvName.Nodes.Add(, , "G0000", TrvBasePar.RootText, "ROOT")
NodeX.Expanded = True
Call FillTree("0000", "G0000", SelectSql)
Else
StrSql = SelectSql & " Where " & TrvBasePar.ParFld & "='" & ParFldValue & "'"
Set Rs = M_DbCtrl.RsOpen(TrvBasePar.Cnn, StrSql)
If Not (Rs.EOF And Rs.BOF) Then
Rs.MoveFirst
While Not Rs.EOF
ChildKey = "G" & CStr("" & Rs.Fields(TrvBasePar.ChildFld))
Set NodeX = TrvBasePar.TrvName.Nodes.Add(ParKey, tvwChild, ChildKey, _
CStr("" & Rs.Fields(TrvBasePar.TextFld)), TrvBasePar.ChildIco)
StrSql = "Select Top 1 " & TrvBasePar.TabName & "." & TrvBasePar.ChildFld & " From " & TrvBasePar.TabName & _
" Where " & TrvBasePar.ParFld & "='" & CStr("" & Rs.Fields(TrvBasePar.ChildFld)) & "'"
Set RsB = M_DbCtrl.RsOpen(TrvBasePar.Cnn, StrSql)
If Not (RsB.EOF And RsB.BOF) Then
NodeX.Image = TrvBasePar.Parico
AddId = AddId + 1
ReDim Preserve ParentArr(1, AddId)
ParentArr(0, AddId - 1) = CStr("" & Rs.Fields(TrvBasePar.ChildFld))
ParentArr(1, AddId - 1) = CStr("G" & CStr("" & Rs.Fields(TrvBasePar.ChildFld)))
End If
Rs.MoveNext
Wend
Set Rs = Nothing
If AddId > 0 Then
For N = 0 To AddId - 1
Pid = ParentArr(0, N)
PKey = ParentArr(1, N)
Call FillTree(Pid, PKey, SelectSql)
Next
End If
End If
End If
End Function