如何实现带树形结构的组合框和列表框, Y8 A% Y% \: H
问题详述 5 [% ]: t: [6 a& }8 g" k* x
在对产品或客户进行分类时,类别需要多层分类结构,也就是常见的树形结构,但access的组合框和列表框都不支持树形结构,只能通过Treeview这个ActiveX控件来实现,不知有没有方法能够在组合框和列表框中实现树形结构呢?3 P- G* {; O, D& V" Y/ F
专家解答
) ]# M! f8 Q+ Z# `+ I8 f2 [ 组合框和列表框的行来源属性可为表或查询,由于组合框和列表框本身的限制,无法直接实现树形结构,所以只能在行来源属性上想办法。创建一个查询,然后通过函数来将数据的内容转换成树形结构的格式,由于组合框和列表框的数据来源于查询,所以就间接地实现了带树形结构的组合框和列表框。5 r' [5 Y1 C" \+ e) ?! z1 V
首先创建一个通用函数,用来实现树形结构的查询结果,详细代码如下。# ]) p% ^; [ D5 B
Public Function GetNodeText(rlngDepth As Long, rlngNextId As Long, rstrClassName As String) As String9 \* `( {2 g8 h6 M! T
Dim sqlClass As String( g6 z5 f/ Y6 B( x
Dim strTemp As String
' D/ a& i6 V, ], g Dim tmpDepth As Integer+ A8 g$ w9 e- N3 e" ?. |
Dim i As Integer
. j! I @2 @+ n& u4 {% k+ D Dim arrShowLine(20) As Boolean
* P h+ j, u) ` For i = 0 To UBound(arrShowLine)& { n0 X* `4 G
arrShowLine(i) = False
& z% \' m) s) j! @9 j Next, j- D4 ?6 e& K5 p2 R& d) G
tmpDepth = rlngDepth0 P/ u! I0 B" G! Q- P! `- ?1 U
If rlngNextId > 0 Then
; K s! X+ T- {6 O( C- [- g4 ?' r arrShowLine(tmpDepth) = True
$ ^9 Q7 {6 y% j5 C- o2 y Else* t& m% N9 H8 j0 W e I* ^) [4 F
arrShowLine(tmpDepth) = False. J. H2 a0 j; E. b8 O; U3 e2 q
End If7 j I# i/ |. o" I' L% w, j$ R
strTemp = ""
9 ]6 f2 q9 f { If tmpDepth = 2 Then7 t2 i0 ~$ t& F( \9 M
End If
& z0 m" n/ Z% l/ n8 t If tmpDepth > 0 Then4 k6 q0 a3 I$ i
For i = 1 To tmpDepth
1 Q: N* ?: r% } V, t strTemp = strTemp & " "
/ ^8 n: j- j; W0 d, W9 t3 u If i = tmpDepth Then
0 T, \+ t1 `0 Y6 |3 o If rlngNextId > 0 Then
# Q1 T) i- A: u0 f6 v( K strTemp = strTemp & "├ "6 T9 V4 j6 Q5 G3 G% [
Else7 d( w1 I& `& P+ D
strTemp = strTemp & "└ "
4 n* j ]7 U5 b) ~# p End If9 D8 U) X. l9 X$ a
Else
$ o, x" q3 U% V6 z$ u& p If i = 1 Then
3 d. C, g/ X' |3 I7 f0 j strTemp = strTemp & "│"- V4 H% i& }& i, T a( _
Else3 D$ H2 V" ?6 u7 S. o+ K
strTemp = strTemp & " "
2 q+ H; f! {4 L0 t0 G' t5 z End If
2 O' T' T" `6 T) Q% M* c6 | End If
. l7 I4 H' d% f Next
+ x6 a9 o( q, S! U1 n' v+ X End If
1 J/ T6 ?4 w8 ~" g- p GetNodeText = strTemp & rstrClassName
4 I, g* e/ U: z End Function
( @, S( C( k- {$ b 然后创建一个查询,查询中使用了上面这个自定义函数进行数据格式转换,查询的语法如下。( I$ ?. k6 _7 Z6 b
SELECT GetNodeText([depth],[NextId],[classname]) AS NodeText, *
0 b- o6 O0 v: U9 i8 G4 \ FROM SoftClass
5 ~9 s) O! T& q2 p- k# ?/ O$ v8 P ORDER BY SoftClass.RootID, SoftClass.OrderID;1 O' R i2 l4 _# Z
最后创建一个新的窗体,在窗体上放置一个组合框及列表框,它们的行来源都设置如下。! E) E/ f! T# F, n, i3 z
SELECT qryClass.NodeText, qryClass.ClassID FROM qryClass;( d5 s' L p# b! b* D! ^$ j# Q: G: b
打开窗体到“窗体视图”状态,可看到带树形结构的组合框和列表框的效果。) u% v9 j$ q6 m/ T
专家点评4 j c3 x f. e/ d' ~
这个例子从查询上实现了树形结构,但在组合框和列表框的实现上还并不完全具备Treeview的所有属性,如双击结点进行展开和收缩、结点图标等。如果要实现展开和收缩功能,需要对组合框和列表框再进行编程,判断当前选择的项目是子结点还是父结点,然后相应改变组合框和列表框行来源对应的查询的内容,再刷新组合框和列表框来实现结点的展开和收缩功能。 |