a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 92|回复: 0

[Access] 如何实现带树形结构的组合框和列表框

[复制链接]
发表于 2012-7-31 22:26:35 | 显示全部楼层 |阅读模式
如何实现带树形结构的组合框和列表框, 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的所有属性,如双击结点进行展开和收缩、结点图标等。如果要实现展开和收缩功能,需要对组合框和列表框再进行编程,判断当前选择的项目是子结点还是父结点,然后相应改变组合框和列表框行来源对应的查询的内容,再刷新组合框和列表框来实现结点的展开和收缩功能。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-17 04:28 , Processed in 0.388131 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表