问题详述
在对产品或客户进行分类时,类别需要多层分类结构,也就是常见的树形结构,但Access的组合框和列表框都不支持树形结构,只能通过Treeview这个ActiveX控件来实现,不知有没有方法能够在组合框和列表框中实现树形结构呢?专家解答
组合框和列表框的行来源属性可为表或查询,由于组合框和列表框本身的限制,无法直接实现树形结构,所以只能在行来源属性上想办法。创建一个查询,然后通过函数来将数据的内容转换成树形结构的格式,由于组合框和列表框的数据来源于查询,所以就间接地实现了带树形结构的组合框和列表框。
首先创建一个通用函数,用来实现树形结构的查询结果,详细代码如下。
Public Function GetNodeText(rlngDepth As Long, rlngNextId As Long, rstrClassName As String) As String<br />Dim sqlClass As String<br />Dim strTemp As String<br />Dim tmpDepth As Integer<br />Dim i As Integer<br />Dim arrShowLine(20) As Boolean<br /><br />For i = 0 To UBound(arrShowLine)<br />arrShowLine(i) = False<br />Next<br />tmpDepth = rlngDepth<br />If rlngNextId > 0 Then<br />arrShowLine(tmpDepth) = True<br />Else<br />arrShowLine(tmpDepth) = False<br />End If<br />strTemp = ""<br />If tmpDepth = 2 Then<br />End If<br />If tmpDepth > 0 Then<br />For i = 1 To tmpDepth<br />strTemp = strTemp & " "<br />If i = tmpDepth Then<br />If rlngNextId > 0 Then<br />strTemp = strTemp & "├ "<br />Else<br />strTemp = strTemp & "└ "<br />End If<br />Else<br />If i = 1 Then<br />strTemp = strTemp & "│"<br />Else<br />strTemp = strTemp & " "<br />End If<br />End If<br />Next<br />End If<br />GetNodeText = strTemp & rstrClassName<br />End Function然后创建一个查询,查询中使用了上面这个自定义函数进行数据格式转换,查询的语法如下
SELECT GetNodeText([depth],[NextId],[classname]) AS NodeText, *<br />FROM SoftClass<br />ORDER BY SoftClass.RootID, SoftClass.OrderID;最后创建一个新的窗体,在窗体上放置一个组合框及列表框,它们的行来源都设置如下。
SELECT qryClass.NodeText, qryClass.ClassID FROM qryClass;打开窗体到“窗体视图”状态,可看到带树形结构的组合框和列表框的效果
专家点评
这个例子从查询上实现了树形结构,但在组合框和列表框的实现上还并不完全具备Treeview的所有属性,如双击结点进行展开和收缩、结点图标等。如果要实现展开和收缩功能,需要对组合框和列表框再进行编程,判断当前选择的项目是子结点还是父结点,然后相应改变组合框和列表框行来源对应的查询的内容,再刷新组合框和列表框来实现结点的展开和收缩功能。
文章来源:Access专家门诊200问

方法二:
一个表 字段如下: id(自动编号) fullname(文本) ProgramID(文本)
programID是5位一段的数字,比如 食品饮料类:00001 饮料类:0000100001 果汁类:000010000100001 山楂汁:00001000010000100001 柠檬汁:00001000010000100002
本方法层数是有限制的,字符串最大是 255,如果5位一层,最大层数只有 51 层,不过多数情况下已经够用了。用本方法在统计信息的时候非常方便: select * from table where ProgramID like '00001*'