节点与行的关系
如果目录树是通过BuildTree、CreateTree、GenerateTree方法根据某数据表内容自动生成的,那么可以通过节点的DataRow属性,返回此节点在数据表中对应的行。
需要注意的是,一个节点可能对应有多个行,DataRow属性将只返回其中一行。
示例一
我们在上一节已经讲述,要设计一个下图所示的筛选树:
设计步骤为:
1、将窗口的AfterLoad事件设为:
Dim
trv As
WinForm.TreeView
= e.Form.Controls("TreeView1")
trv.BuildTree("订单",
"产品|客户|雇员")
trv.Nodes.Insert("显示所有行",0)
2、将目录树的NodeMouseDoubleClick事件设为:
Dim
Filter As
String
Dim
dr As
DataRow = e.Node.DataRow
'获取生成此节点的行
If
e.Node.Text
<> "显示所有行" Then
Select
Case e.Node.Level
Case
0
Filter =
"[产品]
= '"
& dr("产品")
& "'"
Case
1
Filter =
"[产品]
= '"
& dr("产品")
& "' And [客户]
= '"
& dr("客户")
& "'"
Case
2
Filter =
"[产品]
= '"
& dr("产品")
& "' And [客户]
= '"
& dr("客户")
& "' And [雇员]
= '"
& dr("雇员")
& "'"
End Select
End
If
Tables("订单").Filter
= Filter
如果不用DataRow属性,则需要直接拆分节点的FullPath,代码为:
Dim
Filter
As
String
=
""
Dim
Value()
As
String
Value
=
e.Node.FullPath.Split("\")
If
e.Node.Text
<>
"显示所有行"
Then
Select Case
e.Node.Level
Case
0
Filter
=
"[产品]
= '"
&
Value(0)
&
"'"
Case
1
Filter
=
"[产品]
= '"
&
Value(0)
&
"'
And [客户]
= '"
&
Value(1)
&
"'"
Case
2
Filter
=
"[产品]
= '"
&
Value(0)
&
"'
And [客户]
= '"
&
Value(1)
&
"'
And [雇员]
= '"
&
Value(2)
&
"'"
End
Select
End If
Tables("订单").Filter
= Filter
两段代码的功能一样,但是第二种方法只能获取参与生成目录树的列的值,而第一种方法可以获取任意列的值,而且代码的可读性更好,所以帮助多数时候采用第一种方法。
示例二
假定有下图所示的数据表:
通过下面的代码:
Dim
trv As
WinForm.TreeView
= e.Form.Controls("TreeView1")
trv.BuildTree("行政区域","省|县市")
生成的目录树是:
如果希望在目录树节点中同时显示出区号和邮编,如下图:
可以将代码改为:
Dim
trv As
WinForm.TreeView
= e.Form.Controls("TreeView1")
trv.BuildTree("行政区域","省|县市")
trv.StopRedraw
'停止绘制目录树
For
Each nd
As WinForm.TreeNode
In trv.AllNodes
'遍历所有节点
If nd.Level
= 1 Then
'如果是二级节点
nd.Text
= nd.text
& "|"
& nd.DataRow("区号")
& "|"
& nd.DataRow("邮编")
End
If
Next
trv.ResumeRedraw
'恢复绘制目录树
示例三
如果节点和行是一一对应的,那么我们可以在表中快速定位到节点对应的行,例如只需将NodeMouseDoubleClick事件设置为:
Tables("订单").Position = Tables("订单").FindRow(e.Node.DataRow)
这样双击节点,即可快速定位到节点所对应的行。
如果节点和行不是一对多的关系,那么也会定位到其中一个符合条件的行。