a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 87|回复: 0

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

[复制链接]
发表于 2012-7-31 22:26:35 | 显示全部楼层 |阅读模式
如何实现带树形结构的组合框和列表框
' f9 r! t$ x% y& d. o问题详述
0 Z2 f7 ?9 L; e0 a; n  在对产品或客户进行分类时,类别需要多层分类结构,也就是常见的树形结构,但access的组合框和列表框都不支持树形结构,只能通过Treeview这个ActiveX控件来实现,不知有没有方法能够在组合框和列表框中实现树形结构呢?0 E) `  _+ B  R3 R
  专家解答# x0 N3 J2 b% p5 b4 u
  组合框和列表框的行来源属性可为表或查询,由于组合框和列表框本身的限制,无法直接实现树形结构,所以只能在行来源属性上想办法。创建一个查询,然后通过函数来将数据的内容转换成树形结构的格式,由于组合框和列表框的数据来源于查询,所以就间接地实现了带树形结构的组合框和列表框。
& P. H( R6 q8 F6 Y( I2 S0 d* T; G  首先创建一个通用函数,用来实现树形结构的查询结果,详细代码如下。
2 N: q; d1 {5 [  Public Function GetNodeText(rlngDepth As Long, rlngNextId As Long, rstrClassName As String) As String: i+ g7 P2 g/ g$ \
  Dim sqlClass As String
0 O  ^* ~' h% \) x; y6 Q; A) x  Dim strTemp As String
" @* \; E5 D; l9 ]# r& p  Dim tmpDepth As Integer! v# @5 S; E5 m" Q; y2 {
  Dim i As Integer/ i1 T, H" i; I6 g( n- K* O
  Dim arrShowLine(20) As Boolean
8 z( l) T% L9 \* @  For i = 0 To UBound(arrShowLine)/ ?0 Z. U$ r/ s; p
  arrShowLine(i) = False
  }3 T. j3 B" a$ y% V6 ~  Next% M2 k8 n% v! L% I5 o
  tmpDepth = rlngDepth
4 }+ j& z& }/ {, x4 q1 F  If rlngNextId > 0 Then% C1 ?1 N+ w6 |, {% [
  arrShowLine(tmpDepth) = True
% Q8 Z. E- H8 H3 Z! _) m  Else
. l0 S: a, F( x- z  z" q" m  arrShowLine(tmpDepth) = False
' N9 i: ~/ m* R7 T3 @; V  End If7 {' B1 A" ]4 Q8 u0 V9 D/ o
  strTemp = ""
, s& D9 I+ s; L: f( u/ i8 X5 J  If tmpDepth = 2 Then
' j$ u( V6 h2 j  End If
) j3 j+ V' V7 m( s  If tmpDepth > 0 Then% L* _# }* L! T* h
  For i = 1 To tmpDepth+ c5 i  w: i0 ?1 E: r% o
  strTemp = strTemp & " "
5 g8 I3 a, b8 ^* Z6 [0 C1 l4 h0 H  If i = tmpDepth Then
. e( n: R. }+ K5 z- p+ j  If rlngNextId > 0 Then
5 H8 L0 H  r' p( ^. p8 Q" r, x: w  strTemp = strTemp & "├ "
1 `, o# U7 y7 m8 ~2 o0 W5 S  Else
' n- L9 R( O6 P7 x+ B% o  strTemp = strTemp & "└ ". ~5 `* O& u7 f0 ]
  End If  E! q% T* b; k! j
  Else
7 o6 C- ]7 c+ J5 P0 l# ^  If i = 1 Then, K. X+ c0 H: f7 I; s7 a
  strTemp = strTemp & "│"- L4 }) K) X' n( _
  Else2 z8 n" }7 s& `' T
  strTemp = strTemp & " "5 M/ S, m! k, a) X1 G
  End If
% m6 k% g8 ?& G; g  End If* p, ?5 S# q: B  A
  Next
5 Z9 Y; ^: v6 @. K! d* N9 [  End If( A5 r* j/ A. B8 ~4 w
  GetNodeText = strTemp & rstrClassName
; ?' w6 o- ~7 A" @  End Function0 Q, [( S7 T6 u
  然后创建一个查询,查询中使用了上面这个自定义函数进行数据格式转换,查询的语法如下。
0 J. @! F; l& _' q7 a  SELECT GetNodeText([depth],[NextId],[classname]) AS NodeText, */ k. p' ], |. _+ Q
  FROM SoftClass
5 o+ N" F7 v+ Q; y" W  ORDER BY SoftClass.RootID, SoftClass.OrderID;
5 }  s; L# |9 `4 O0 d- k8 m. n1 P* a3 s  最后创建一个新的窗体,在窗体上放置一个组合框及列表框,它们的行来源都设置如下。6 Y) \) e& g0 Y- N& ?! R
  SELECT qryClass.NodeText, qryClass.ClassID FROM qryClass;8 V# S: U1 |0 B. c9 f  _+ [
  打开窗体到“窗体视图”状态,可看到带树形结构的组合框和列表框的效果。
  x. E: l2 G1 H  专家点评
4 i5 a6 k- Q; s: Y) c  这个例子从查询上实现了树形结构,但在组合框和列表框的实现上还并不完全具备Treeview的所有属性,如双击结点进行展开和收缩、结点图标等。如果要实现展开和收缩功能,需要对组合框和列表框再进行编程,判断当前选择的项目是子结点还是父结点,然后相应改变组合框和列表框行来源对应的查询的内容,再刷新组合框和列表框来实现结点的展开和收缩功能。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 04:34 , Processed in 0.426783 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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