大型目录树的生成
本节的内容可以参考CaseStudy目录下的示例文件:快速生成目录树.Table
如果目录树有节点数量非常多,那么可能需较长的时间才能生成, 此时可以考虑动态生成子节点以节省时间。
基本的思路并不复杂:
首先只生成顶层节点,运行过程中每当用户选择某个节点,就判断此节点是否存在子节点,如果不存在,就生成此节点的子节点。
示例一
假定根据客户表的地区、城市、公司名称三列生成目录树:
1、首先在窗口中插入一个目录树,将窗口的AfterLoad事件代码设置为:
Dim
vals As
List(Of
String) = 
DataTables("客户").GetValues("地区")
Dim
tre As
WinForm.TreeView 
= e.Form.Controls("TreeView1")
For
Each val
As String
In vals
    
Dim
nd As
WinForm.TreeNode 
=  tre.Nodes.Add(val)
'增加地区节点
    nd.Nodes.Add("")
'增加一空子节点,否则节点左边不会显示+号
Next
这样打开窗口之后,只生成顶层的地区节点。
2、将目录树的AfterSelectNode事件代码设置为:
If
e.Node.Level 
= 0 Then
'如果是顶级节点,也就是地区节点
    If e.Node.Nodes.Count 
= 1 AndAlso
e.Node.Nodes(0).Text 
= ""  Then 
'如果存在一个空子节点
        e.Node.Nodes.Clear()
'清除之前的空子节点
        Dim 
flt As 
String = "地区 = '"
& e.Node.Text
& "'"
        For 
Each val As
String In
DataTables("客户").GetValues("城市",flt)
            Dim nd
As WinForm.TreeNode 
= e.Node.Nodes.Add(val)
'增加城市节点
            nd.Nodes.Add("")
'增加一个空子节点,否则节点左边不会有+号
        Next
    End 
If
ElseIf
e.Node.Level 
= 1 Then
'如果是二级节点,也就是城市节点
    If e.Node.Nodes.Count 
= 1 AndAlso
e.Node.Nodes(0).Text 
= ""  Then 
'如果存在一个空子节点
        e.Node.Nodes.Clear()
'清除之前的空子节点
        Dim 
flt As 
String = "城市 = '"
& e.Node.Text
& "' And 地区 = '"
& e.Node.ParentNode.Text
& "'"
        For 
Each dr As
DataRow In
DataTables("客户").Select(flt)
            e.Node.Nodes.Add(dr("客户ID"),
dr("公司名称")) 
'节点名称用"客户ID", 节点标题用"客户名称"
        Next
    End 
If
End 
If
示例二
以上示例客户表已经加载所有数据,如果客户表只加载了部分数据,甚至没有加载数据,那么如何生成完整的目录树呢。
一样的简单,代码基本一样,核心在于利用SQLGetValues从后台提取数据:
1、AfterLoad事件代码改为:
Dim
vals As
List(Of
String) = 
DataTables("客户").SQLGetValues("地区")
Dim
tre As
WinForm.TreeView 
= e.Form.Controls("TreeView1")
For
Each val
As String
In vals
    
Dim
nd As
WinForm.TreeNode 
=  tre.Nodes.Add(val)
'增加地区几点
    nd.Nodes.Add("")
'增加一空子节点,否则节点左边不会显示+号
Next
2、目录树的AfterSelectNode事件代码改为:
If
e.Node.Level 
= 0 Then
'如果是顶级节点,也就是地区节点
    If e.Node.Nodes.Count 
= 1 AndAlso
e.Node.Nodes(0).Text 
= ""  Then 
'如果存在一个空子节点
        e.Node.Nodes.Clear()
'清除之前的子节点
        Dim 
flt As 
String = "地区 = '"
& e.Node.Text
& "'"
        For 
Each val As
String  In 
DataTables("客户").SQLGetValues("城市",flt)
            Dim nd
As WinForm.TreeNode 
=  e.Node.Nodes.Add(val)
'增加城市节点
            nd.Nodes.Add("")
'增加一个空节点,否则节点左边不会有+号
        Next
    End 
If
ElseIf
e.Node.Level 
= 1 Then
'如果是二级节点,也就是城市节点
    If e.Node.Nodes.Count 
= 1 AndAlso
e.Node.Nodes(0).Text 
= ""  Then 
'如果存在一个空子节点
        e.Node.Nodes.Clear()
'清除之前的子节点
        Dim 
flt As 
String = "城市 = '"
& e.Node.Text
& "' And 地区 = '"
& e.Node.ParentNode.Text
& "'"
        For 
Each Vals As
String() In
DataTables("客户").SQLGetValues("客户ID|公司名称",
flt)
            e.Node.Nodes.Add(Vals(0),
Vals(1)) 
'节点名称用"客户ID", 节点标题用"客户名称"
        Next
    End 
If
End 
If
参考: SQLGetValues